Salvando Erros da Aplicação com Log4Net
Autor: Clayr Madeira | Publicado: 2011-08-12T05:27:00-07:00

Habitualmente aplicações precisam salvar os erros que foram gerados, isso ajuda a encontrar a origem do erro. Dessa forma a solução para o problema vem muito mais rápida. Esses erros salvos em arquivos são chamados de Log.Em aplicações .NET temos diversas maneiras de implementar uma rotina de Log da aplicação, existem frameworks próprias e você também pode gerar sua própria rotina de Log. Uma maneira simples de fazer isso na sua aplicação é usando o Log4Net, basta algumas configurações simples e esta pronto.Primeiro é preciso baixar o Log4Net e adicionar como referencia na sua aplicação,&nbsp;clique aqui para efetuar o download da DLL. Crie um novo projeto ou use um que já exista e adicione a referencia da DLL que acabou de baixar.


Após fazer isso, abra o Web.config e configure da tag configSections que será usado o Log4Net. Se não tiver a tag configSections e preciso criar:&lt;configuration&gt;&nbsp; &nbsp; &lt;configSections&gt;&nbsp;&nbsp;&nbsp; &lt;section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /&gt;&nbsp; configSections&gt;
configuration&gt;
Ainda dentro do configuration é preciso adicionar as configurações de onde será salvo o arquivo, o que será salvo no arquivo (error, warning, debug e etc), vamos colocar a configuração básica:&nbsp; &lt;log4net&gt;&nbsp;&nbsp;&nbsp; &lt;appender name="RollingFile" type="log4net.Appender.RollingFileAppender"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;file value="Log\\MeuArquivo.log"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;appendToFile value="true"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;datePattern value="yyyy-MM-dd"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rollingStyle value="Composite"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;maximumFileSize value="1MB"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;maxSizeRollBackups value="50"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;layout type="log4net.Layout.PatternLayout"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="ConversionPattern" value="%newline[%-5level]%newline%message%newline"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout&gt;&nbsp;&nbsp;&nbsp; appender&gt;&nbsp;&nbsp;&nbsp; &lt;logger name="LogInFile"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O nivel de log que será incluido no appender --&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;level value="All"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;appender-ref ref="RollingFile"/&gt;&nbsp;&nbsp;&nbsp; logger&gt;&nbsp; log4net&gt;
Na tag maximumFileSize será definido o tamanho que o arquivo deve atingir, quando ele chegar no tamanho máximo, será criado um novo arquivo.
Na tag appender podemos definir como vai ser salvo esse log. A framework da diversas opções para isso, podendo salvar em banco de dados como SQL Server, Oracle, DB2, SQLite e Microsoft Access,&nbsp; pode ser salvo em arquivo, email entre outras. Para informações de como implementar essas outras maneiras, acesse: http://logging.apache.org/log4net/release/config-examples.html
Precisamos colocar dentro do arquivo Global.asax, dentro do método Application Start que vamos usar a configuração do Log4Net, logo ficará dessa forma:&nbsp;&nbsp;&nbsp; public class Global : System.Web.HttpApplication&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void Application_Start(object sender, EventArgs e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4net.Config.XmlConfigurator.Configure();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void Application_End(object sender, EventArgs e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void Application_Error(object sender, EventArgs e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void Session_Start(object sender, EventArgs e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void Session_End(object sender, EventArgs e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {}&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Após essa configuração vamos exemplificar o uso, para isso vamos abrir a página padrão do nosso projeto e vamos implementar um método de exemplo para utilização do Log4Net.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private log4net.ILog logger;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void Page_Load(object sender, EventArgs e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Vamos usar o logger LogInFile, que salva todos os tipos de erro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger = log4net.LogManager.GetLogger("LogInFile");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.Debug("Lança a mensagem no nivel de debug");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.Info("Lança a mensagem de info");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.Error("Lança a mensagem de error");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.Warn("Lança a mensagem de warning");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
Ao executar o código, vamos ter o seguinte resultado:

Dentro da configuração no arquivo Web.config você pode configurar que só será salvo o que for lançado como erro, dessa forma:&nbsp;&nbsp;&nbsp; &lt;logger name="LogInFile"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;level value="Error"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;appender-ref ref="RollingFile"/&gt;&nbsp;&nbsp;&nbsp; logger&gt;
Uma solução simples, porém é muito importante saber qual informação salvar para identificar o erro do usuário. Seria uma boa prática criar uma classe para salvar informações nesse arquivo, temos diversas maneiras de pegar informações desse erro, e do status da aplicação no momento que ocorreu o erro. Um exemplo de uma classe simples para manipular seria:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private log4net.ILog logger;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void GravaError(Exception ex)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger = log4net.LogManager.GetLogger("LogInFile");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuilder buffer = new StringBuilder();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.AppendFormat("{0}", ex.ToString());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ex.InnerException != null)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex = ex.InnerException;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.AppendFormat("\n {0}", ex.InnerException.ToString());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.Error(buffer.ToString());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
Usando esse exemplo de classe, podemos usar o método GravaErro sempre que houver um erro, basta passar como parâmetro o erro que ele vai salvar no arquivo.
Código do projeto