Instrumentação .NET – EventLog
No artigo de hoje irei demonstrar como usar o Visualizador de Eventos do Windows para instrumentar sua aplicação.
Para acessar o Visualizador de Eventos do Windows digite “eventvwr” no executar. Este gerenciador de eventos disponibiliza, na janela da esquerda, todos os EventLog cadastrados no computador, o próprio Windows utiliza eles para logar eventos do sistema. Já na janela da direita, quando você selecionar um EventLog deve aparecer uma lista de eventos que foram registrados pelo Windows. Preste atenção na coluna “Fonte”, ela indica de onde veio este evento, que no nosso caso virá do aplicativo criado.
Para criar um EventLog via código para ser usado pela sua aplicação devemos importar o namespace System.Diagnostics e utilizar a classe EventLog. Como no exemplo abaixo:
EventLog.CreateEventSource(“Fonte”, “TesteLog”);// Cria um EventLog junto com uma fonte válida
EventLog.CreateEventSource(“Fonte2”, “TesteLog”);// Cria uma segunda fonte aproveitando o EventLog já criado
Você pode perceber que o EventLog contêm uma inteligência dentro da criação do evento, ou seja, caso o evento já tenha sido criado ele aproveita este evento e adiciona uma fonte nele. Outra item interessante é que, quando você cria um EventLog automaticamente ele cria um uma fonte de mesmo nome. Isto garante que o EventLog poderá ser usado.
Quando você cria uma nova fonte, você deve verificar se esta fonte já não esta registrada no computador, se já estiver registrada sua aplicação irá disparar uma exceção. Segue abaixo alguns recursos interessante que o EventLog tem para você evitar este problema e outros.
EventLog.Exists(“TesteLog”); //Verifica se existe um EventLog
EventLog.SourceExists(“TesteLog”); //verifica se existe uma fonte
EventLog.Delete(“TesteLog”); //Apaga o EventLog junto com todas as suas fontes
EventLog.DeleteEventSource(“Fonte”); //Exclui a fonte do evento
EventLog.CreateEventSource(“Fonte”, “TesteLog”);// Cria um EventLog junto com uma fonte válida
Você pode retornar uma lista de EventLogs cadastrados no computador utilizando o método GetEventLogs. Segue abaixo um exemplo.
foreach (EventLog e in EventLog.GetEventLogs())
{
Console.WriteLine(e.Log); //Nome do Log
Console.WriteLine(e.Source); //Recupera o nome da fonte ou registra quando você der uma entrada no log
Console.WriteLine(e.LogDisplayName); //Nome de visualização
Console.WriteLine(e.MachineName); //Maquina a qual o log esta referenciado
Console.WriteLine(e.OverflowAction.ToString()); //Retorna qual será o comportamento do log caso ele fique cheio
}
Enfim vamos aprender como registrar um evento que aconteceu na sua aplicação.
EventLog log = new EventLog(“TesteLog”); //Configura qual EventLog será utilizado para gravar o evento
log.Source = “Fonte”; //Configura em qual fonte será a entrada do evento.
log.WriteEntry(“Erro da aplicação”, EventLogEntryType.Error, 1001, 1); //Efetiva as configurações anteriores e grava o evento
Perceba que o método WriteEntry aceita quatro parâmetros de entrada. O primeiro é a descrição do evento, o segundo é o tipo do evento, que pode ser de Erro, Informação, Alerta, Sucesso ou Falha em uma auditoria de segurança, já os últimos dois são utilizados para identificar mais fácil o evento, Id do Evento e Id da Categoria. É muito útil caso você crie uma documentação do seu sistema. Porém você pode usar outros métodos WriteEntry que contêm menos parâmetros.
Para ler os eventos registrados em um determinado EventLog utilize o seguinte exemplo.
EventLog log = new EventLog(“TesteLog”); //Recupera um log existente
foreach (EventLogEntry entrada in log.Entries)
{
Console.WriteLine(entrada.Message); //Descrição do evento ocorrido
Console.WriteLine(entrada.Category); //Categoria do evento
Console.WriteLine(entrada.CategoryNumber); //Número da categoria do evento
Console.WriteLine(entrada.EntryType.ToString()); //Tipo do evento
Console.WriteLine(entrada.Index); //Índice do evento em relação a lista
Console.WriteLine(entrada.MachineName); //Maquina a qual o evento foi geral
Console.WriteLine(entrada.Source); //Fonte do evento
Console.WriteLine(entrada.TimeWritten); //Qual horário o evento foi escrito
Console.WriteLine(entrada.TimeGenerated); //Qual horário o evento foi gerado
Console.WriteLine(entrada.UserName); //Qual usuário estava logado durante o evento
}
E finalmente, para limpar o EventLog utilize o método Clear.
EventLog log = new EventLog(“TesteLog”); //Recupera um log existente
log.Clear(); //Limpa todas as entradas de um EventLog específico
Espero que este post tenha sido simples e prático e que possa ajudar você a instrumentar sua aplicação.