.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:
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:
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:
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