.NET - Usando os recursos de Log (My.Application.Log)


Gravar informações de log de uma aplicação é um recurso básico e fundamental para uma aplicação robusta quer por razões de auditoria, segurança, rastreamento ou apenas informação. Você pode criar o seu próprio log ou usar os recursos que o Visual Basic oferece para isso.

Nota: Eu já publiquei alguns artigos sobre como criar um log de erros, para saber mais veja em:

Criando um log de erros
ASP.NET - Criando um log de erros

Se você pretende criar o seu próprio arquivo de log vou dar uma força mostrando um código que pode ser usado como ponto de partida.

O Visual Basic oferece os objetos My.Applicaton.Log e My.Log que tornam fácil a gravação de informações de log e rastreamento em logs.

O objeto My.Application.Log fornece propriedades e métodos para gravar informações referente a eventos e exceções que ocorrem durante a execução de uma aplicação cliente no log do aplicativo. (Para aplicações web temos o objeto My.log)

Algumas das tarefas básicas que podem ser realizadas pelo My.Application.log são:

O objeto My.Application.Log pode gravar as informações para vários logs ouvintes. Os logs ouvintes são configurados pelo arquivo de configuração do computador e podem ser substituídos por um arquivo de configuração do aplicativo. Os métodos WriteEntry e WriteExcepton são usados para gravar mensagens no log do aplicativo avaliando a gravidade da mensagem usando as propriedades TraceSource e Switch.

Exemplo de gravação de uma mensagem no log do aplicativo:    My.Application.Log.WriteEntry("Teste de gravação")

O diagrama abaixo mostra o fluxo de gravação de uma mensagem usando o método WriteEntry

1- A esquerda temos o fluxo de gravação no log do aplicativo

2- A direita temos a correspondência entre as partes do log e o arquivo de configuração

Mas onde as mensagens de log são gravadas ?

As mensagens são gravadas no arquivo de log, e, de forma padrão, o arquivo de log esta localizado no caminho para dados do aplicativo do usuário. Este caminho pode ser obtido através da propriedade DefaultFileLogWriter.FullLogFileName.

Nota: O objeto Log tem uma implementação padrão que funciona sem um arquivo de configuração de aplicativo, app.config. Para alterar os padrões você deve adicionar um arquivo de configuração com as novas definições.

Abra o Visual Basic 2008 Express Edition e crie uma aplicação Windows Forms Application com o nome Net_log:

Inclua um botão de comando no formulário e no seu evento Click inclua o seguinte código:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim caminho As String = My.Application.Log.DefaultFileLogWriter.FullLogFileName

        MsgBox(" Caminho de localização de gravação do log : " & caminho)

        My.Application.Log.WriteEntry("Macoratti - gravando no log da aplicação...")

        MsgBox("gravei no log")
    End Sub

A linha de comando :

Dim caminho As String = My.Application.Log.DefaultFileLogWriter.FullLogFileName

obtém o caminho do log da aplicação que no meu caso (no seu será diferente) é:

C:\Documents and Seetings\Macoratti\Dados de Aplicativos\Net_log\1.0.0.0\Net_log.log

Observando no Debug a janela Immediate Window você verá:

E se você abrir a pasta indicada verá o arquivo Net_log.log.

Você pode usar outras propriedades de My.Application.Log para prover mais informações no arquivo de log. Veja a seguir um exemplo:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       
 Dim caminho As String = My.Application.Log.DefaultFileLogWriter.FullLogFileName

        With My.Application.Log.DefaultFileLogWriter
            .AutoFlush = True
            .Append = True
            .IncludeHostName = True
            .MaxFileSize = 100000
            .Delimiter = ","
            .LogFileCreationSchedule = LogFileCreationScheduleOption.Daily
        End With

        MsgBox(" Caminho de localização de gravação do log : " & caminho)

        My.Application.Log.WriteEntry("Macoratti - gravando no log da aplicação...")

        MsgBox("gravei no log")
    End Sub

Será criado o arquivo Net_log-2008-05-20 contendo as seguintes informações:

DefaultSource,Information,0,Macoratti - gravando no log da aplicação,MAC

Você pode alterar o local da gravação do log usando a propriedade Location tendo as seguintes opções:

Você pode usar os objetos My.Application.Log. e My.Log para registrar informações sobre exceções que ocorrerem em seu aplicativo. Nestes casos você usa o método My.Application.Log.WriteException que pode ser usado para registrar informações sobre:

  1. - Exceções que você capturar explicitamente;
  2. - Exceções que não são manipuladas;

Veja um exemplo para cada um dos casos:

1 - Registrando log para uma exceção manipulada

Primeiro você deve criar o seu método para gerar as informações da exceção, veja a seguir um exemplo:


Public Sub ExceptionLogTeste(ByVal numero As Integer)
        Try
            'código que irá gerar uma exceção
            Dim r As Integer = numero / 0
        Catch ex As Exception
            My.Application.Log.WriteException(ex, TraceEventType.Error, "Exceção em ExceptionLogTeste " & "com argumento " & numero & ".")
        End Try
End Sub

Ao chamar o método passando um número como argumento a divisão por zero irá gerar uma exceção que será gravada no arquivo de log: Net_log-2008-05-20.txt

DefaultSource,Error,2,Arithmetic operation resulted in an overflow. Exceção em ExceptionLogTeste com argumento 100.,MAC

2- Registrando o log para uma exceção não manipulada:

  • Tenha um projeto selecionado no Solution Explorer. No menu Project, escolha Properties.
  • Clique na guia Application.
  • Clique no botão View Application Events para abrir o Editor de Código. Isso abre o arquivo ApplicationEvents.vb.
  • Deixe o arquivo ApplicationEvents.vb aberto no Editor do Código. No menu General, escolha MyApplication Events.
  • No menu Declarations, escolha UnhandledException.
  •         Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) 
    Handles Me.UnhandledException
    
                My.Application.Log.WriteException(e.Exception, TraceEventType.Critical, "Aplicação em shut down as : " _ 
     & My.Computer.Clock.GmtTime.ToString)
    
            End Sub

    Com isso dei uma breve introdução a esse importante recurso da plataforma .NET mas se você escolher criar o seu próprio log pode usar o exemplo abaixo como ponto de partida:

    Criando o seu próprio log

    - Crie um projeto no VB 2008 e a seguir inclua uma classe no projeto chamada MeuLog.vb;

    Imports System.IO
    Public Class MeuLog
        Const DefaultLogFile As String = "C:\dados\LogFile.txt"
    
        Shared Sub Log(ByVal msg As String, ByVal nomeArquivo As String)
            Dim objLogFile As StreamWriter
    
            If IO.File.Exists(nomeArquivo) Then
                objLogFile = File.AppendText(nomeArquivo)
            ElseIf Directory.Exists(Path.GetDirectoryName(nomeArquivo)) Then
                objLogFile = File.CreateText(nomeArquivo)
            Else
                objLogFile = File.AppendText(DefaultLogFile)
            End If
    
            objLogFile.WriteLine(msg)
            objLogFile.Flush()
            objLogFile.Close()
        End Sub
    End Class

    Para usar o método definido na classe use a seguinte chamada:

    MeuLog.Log("Macoratti - iniciando o log.", "C:\dados\testeLog.txt")
    MeuLog.Log(String.Format("Exibindo dados no log, {0} {1} saida", "B", "A"), "C:\dados\testeLog.txt")

    E eu vou ficando por aqui, aguarde mais artigos sobre o assunto...

    Eu sei , é apenas VB .NET , mas eu gosto...

    Referências:


    José Carlos Macoratti