log4net  -  Registrando eventos em um banco de dados


Este artigo mostra como usar o log4net para registrar eventos de log em um banco de dados em uma aplicação Visual Basic .NET.

Nota: Para saber mais sobre métodos de extensão veja o artigo: VB.NET - Extensions Methods

No meu artigo .NET - Apresentando e usando Log4Net eu já apresentei os conceitos básicos do log4net, mostrando alguns exemplos bem básicos. Dessa forma vou iniciar diretamente com a parte prática. Para conhecer os conceitos sobre o log4net leia o artigo citado.

Registrando eventos de log em um banco de dados

Abra o Visual Studio 2012 Express for desktop e clique em New Project;

Selecione a linguagem Visual Basic e o template Windows Forms Application e informe o nome Log4Net_BD e clique em OK;

Vamos adicionar uma referência a library log4Net em nosso projeto. Podemos fazer isso manualmente baixando o pacote do site da Apache ou usando o Nuget. Vou usar o Nuget pois é mais fácil e prático.

A seguir clique no menu TOOLS -> Library Package Manager -> Manage Nuget Package for Solution;

Clique na guia OnLine e a seguir digite na caixa de busca log4net;

Escolha o pacote log4Net 1.2.12 e clique no botão Install;

Obs: Você pode fazer a instalação manual abrindo o console do Nuget e digitando o comando: Install-package log4net

Confirme a instalação e ao final clique no botão Close;

Abra a janela DataBase Explorer e clique com o botão direito sobre Data Connections;

Seleciona Add Connections e na janela apresentada informe o nome do servidor LocaDB e o nome do banco de dados Log4Net conforme abaixo:

Confirme a criação do arquivo.

Na janela do Database Explorer expanda os objetos do banco de dados recém-criado e clique com o botão direito sobre Tables selecionando a opção Add New Table;

A seguir vamos definir a estrutura da tabela onde vamos registrar os eventos de log conforme mostra a figura a seguir:

Criamos assim a tabela Log com a estrutura acima onde iremos registrar os eventos de log.   

Você pode clicar sobre o banco de dados criado na janela DataBase Explorer em Add Connections para verificar a string de conexão do banco de dados que será usada no arquivo de configuração.

Clique duas vezes sobre o banco de dados Log4Net e na janela Properties verifique a propriedade Connection String conforme mostrada na figura abaixo:

Agora temos que configurar nossa aplicação para usar o banco de dados criado definindo no arquivo de configuração da aplicação App.Config alguns parâmetros de configuração para ativa o log4net, informar a string de conexão e definir como o log4net vai gravar as informações.

Vamos abrir o arquivo App.Config e primeiro vamos criar uma section definida com o nome "log4net" no arquivo de configuração entre as tags <configSections>.

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

   <configSections>

       <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>

</configSections>
.....

A seguir temos que criar a section "log4net" onde iremos definir o banco de dados, a tabela, os campos que iremos usar, o appender que iremos usar, os filtros ,etc.

Abaixo vemos a section log4net criada e na tag <root> a definição do appender ADONetAppender que estamos usando, onde iremos definir o banco de dados, a tabela, os campos e os parâmetros que iremos gravar:

....
<log4net>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="ADONetAppender" />
    </root>

   <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="Data Source=(LocalDB)\v11.0;Initial Catalog=Log4Net;Integrated Security=True" />
      <commandText value="INSERT INTO Log (Date,Thread,Level,Logger,Message,Exception) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterName value="@log_date"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>
      <parameter>
        <parameterName value="@thread"/>
        <dbType value="String"/>
        <size value="255"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level"/>
        <dbType value="String"/>
        <size value="60"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger"/>
        <dbType value="String"/>
        <size value="300"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message"/>
        <dbType value="String"/>
        <size value="3000"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception"/>
        <dbType value="String"/>
        <size value="3000"/>
        <layout type="log4net.Layout.ExceptionLayout"/>
      </parameter>

       <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="INFO"/>
        <levelMax value="FATAL"/>
      </filter>

    </appender>
    </log4net>
....

Nota você pode obter a estrutura do ADONetAppender no site oficial do log4net.

Se você quiser habilitar o debug interno pode incluir a chave (key): log4net.Internal.Debug  no seu arquivo de configuração:

<appSettings>
    <add key="log4net.Internal.Debug" value="true"/>
</appSettings>

Esta configuração permite escrever mensagens de debug no console.

Se você quiser pode logar essas mensagens em uma arquivo texto adicionando um trace listerner ao seu arquivo de configuração:

<system.diagnostics>
    <trace autoflush="true">
        <listeners>
            <add 
                name="textWriterTraceListener" 
                type="System.Diagnostics.TextWriterTraceListener" 
                initializeData="C:\dados\Macoratti_log4net.txt" />
        </listeners>
    </trace>
</system.diagnostics>

Agora já temos tudo pronto para gravar o log no banco de dados. 
Na aplicação VB .NET abra o módulo Module1 e defina o código conforme abaixo:
Module Module1
    Private ReadOnly log As log4net.ILog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
    Sub Main()
        log4net.Config.XmlConfigurator.Configure()
        log.Debug("Usando log para DEBUG")
        log.Info("Usando log para INFO")
        log.Warn("Usando log para WARN")
        log.Error("Usando log para ERROR")
        log.Fatal("Usando log para Fatal")
        Console.WriteLine(" log4net usado com sucesso !!! logs gravados ")
        Console.ReadKey()
    End Sub
End Module
Estamos carregando as configurações do log4net na linha de código:
 Private ReadOnly log As log4net.ILog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
Você pode definir esta linha no arquivo Global.asax em Application_Start de forma a não ter que ficar chamando o código sempre que executar o módulo.
A seguir estamos logando usando os níveis disponíveis do log4net.
Executando e verificando o banco de dados iremos ver os logs gravados na tabela Log conforme mostra a figura abaixo: 
Simples e elegante...
Pegue o projeto completo aqui: Log4Net_BD.zip

Mateus 15:19 Porque do coração procedem os maus pensamentos, homicídios, adultérios, prostituição, furtos, falsos testemunhos e blasfêmias.

Mateus 15:20 São estas as coisas que contaminam o homem; mas o comer sem lavar as mãos, isso não o contamina.

  

Referências:

José Carlos Macoratti