ASP .NET - Criando um log de erros para auditoria

É uma boa prática registrar todos erros de sua aplicação em um arquivo texto ou banco de dados para análise de desempenho e também para acompanhar como sua aplicação esta funcionando.

Neste artigo vou mostrar uma das formas de como criar um log de erros em um arquivo texto para auditoria usando uma aplicação ASP .NET Web Forms.

No exemplo do artigo vou usar o template Web Site e criar um site vazio onde irei incluir uma página Default.aspx, um arquivo Global.asax e uma classe Log onde implementarei o código para capturar e gravar os erros no arquivo texto.

Recursos usados

Criando o Web Site ASP .NET

Abra o  Visual Studio 2013 Express for web e clique em New Web Site;

 

A seguir selecione o template Visual Basic -> Web -> ASP .NET Empty Web Site e informe o nome LogAuditoria e clique no botão OK;

 

 

A seguir clique no menu WEBSITE e em Add New Item;

 

Selecione o template Web Form e informe o nome Default.aspx e clique no botão Add;

 

 

Como criei um web site vazio vou ter que incluir o arquivo Global.asax na aplicação.

 

Agora clique novamente no menu WEBSITE e a seguir em Add New Item e selecione o template Global Application Class aceitando o nome Global.asax e clicando  no botão Add;

 

 

Vamos criar a classe Log no web site. Clique com o botão direito sobre o nome do web site e a seguir em Add Class;

 

Informe o nome Log.cs e clique em OK;

 

Irá surgir uma caixa de diálogo solicitando a confirmação para criar o arquivo na pasta App_Code. Apenas confirme.

 

Agora na classe Log inclua o método LogErro com dois parâmetros :  ex do tipo Exception e source do tipo String.

 

A seguir inclua o código abaixo neste método:

 

Imports Microsoft.VisualBasic
Imports System.IO
Public Class Log
    Public Shared Sub LogErro(ex As Exception, source As String)
        Try
            Dim LogArquivo As String = HttpContext.Current.Request.MapPath("/Errolog.txt")
            If LogArquivo <> "" Then
                Dim Mensagem As String = String.Format("{0}{0}=== {1} ==={0}{2}{0}{3}{0}{4}{0}{5}", Environment.NewLine, DateTime.Now, ex.Message, source, ex.InnerException, ex.StackTrace)
                Dim binLogString As Byte() = Encoding.[Default].GetBytes(Mensagem)
                Dim arquivoLog As New FileStream(LogArquivo, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write)
                arquivoLog.Seek(0, System.IO.SeekOrigin.[End])
                arquivoLog.Write(binLogString, 0, binLogString.Length)
                arquivoLog.Close()
            End If
        Catch
           'Não precisamos capturar o erro aqui
      End Try
    End Sub
End Class

Abaixo a versão para C# :

using System;
using System.Text;
using System.Web;
using System.IO;
namespace logAuditoria
{
    public class Log
    {
        public static void LogErro(Exception ex, string source)
        {
            try
            {
                string LogArquivo = HttpContext.Current.Request.MapPath("/Errolog.txt");
                if (!string.IsNullOrEmpty(LogArquivo))
                {
                    string Mensagem = string.Format("{0}{0}=== {1} ==={0}{2}{0}{3}{0}{4}{0}{5}", Environment.NewLine, DateTime.Now, ex.Message, source, ex.InnerException, ex.StackTrace);
                    byte[] binLogString = Encoding.Default.GetBytes(Mensagem);
                    FileStream arquivoLog = new FileStream(LogArquivo, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write);
                    arquivoLog.Seek(0, System.IO.SeekOrigin.End);
                    arquivoLog.Write(binLogString, 0, binLogString.Length);
                    arquivoLog.Close();
                }
                //Não precisamos capturar o erro aqui
            }
            catch
            {
            }
        }
    }
}

Estamos logando :

  1. URL  da página
  2. A mensagem de erro
  3. A InnerException
  4. O StackTrace.

Isso deve ser suficiente para compreender o motivo de algum erro na página e proceder ao ajuste se for o caso.

Observe que o método é estático (Shared) de forma que poderemos usá-lo sem criar uma instância da classe Log.

Em uma aplicação em camadas podemos criar o log na camada de negócio (Bussiness Logic Layer).

Abra o arquivo Global.asax e no método Application_Error inclua o código a seguir:

  Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        ' Code that runs when an unhandled error occurs
        Dim ex As Exception = Server.GetLastError()
        Log.LogErro(ex, HttpContext.Current.Request.Path)
        Server.ClearError()
    End Sub

Agora para concluir crie um arquivo chamado ErroLog.txt na raiz da aplicação e conceda a permissão de leitura e escrita de forma que o erro possa ser gravado no arquivo. (Faça isso somente em produção pois no desenvolvimento podemos gravar no arquivo)

Agora qualquer exceção não tratada (no bloco Try/Catch) e a nível de erro de página será gravada no arquivo de log da aplicação.

Pegue  o projeto completo aqui: LogAuditoria.zip

João 4:34 Disse-lhes Jesus: A minha comida é fazer a vontade daquele que me enviou, e completar a sua obra.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti