Log de aplicações .NET através do Event Viewer
Veja neste artigo como registrar, a partir de aplicações construídas sob o .NET Framework, mensagens de log no Visualizador de Eventos do Windows (utilitário este também conhecido como Event Viewer).
O monitoramento de aplicações num ambiente corporativo é uma tarefa extremamente importante, fornecendo meios para que administradores de sistemas possam atuar diante de eventos inesperados em tais softwares. A técnica que garante a geração das informações necessárias para atividades deste tipo é conhecida pelo nome de instrumentação.
Muitas vezes, a gravação de dados que descrevem o que vem acontecendo em uma aplicação acaba por ser relegada a um segundo plano. Isto se deve a uma série de razões bem conhecidas por aqueles que estão familiarizados com a área de TI, passando desde pela pressão na entrega mais rápida de projetos, ou até mesmo pelo próprio desconhecimento/esquecimento dos envolvidos na construção/implantação de um sistema em se atentar a esses detalhes.
Além disso, quando se considera o cenário atual, é um fato bastante comum que muitas organizações também estejam sujeitas a rigorosas auditorias em seus processos. Um bom exemplo disso são companhias com ações negociadas em bolsas de valores. Em tais casos, diversas medidas decorrentes de regulamentações financeiras precisarão ser adotadas, incluindo nisto a gravação de dados que possibilitem rastrear eventos que aconteceram em aplicações de uso cotidiano.
Ao conjunto de registros que descrevem as mais diversas ocorrências dentro de um sistema dá-se o nome de log. Diversas são as abordagens que podem ser empregadas na gravação de informação deste gênero:
- Uma das técnicas mais comuns consiste na criação de tabelas de log em bases relacionais. Embora isso seja uma boa solução na maioria dos casos, uma provável indisponibilidade do servidor de dados impedirá que se registrem informações (inclusive a geração de um registro que identifique a própria indisponibilidade do banco);
- Outra possibilidade seria a gravação de informações em arquivos de texto ou ainda, no formato XML. Existem até mesmo ferramentas e frameworks que oferecem funcionalidades neste sentido, sendo que o log4net (http://logging.apache.org/log4net/) uma alternativa gratuita bastante difundida;
- Um terceiro caminho seria o uso de alguma estrutura própria de um sistema operacional. No caso específico da plataforma Windows, o componente conhecido como Event Viewer (Figura 1) representa uma boa solução nesse sentido. Permitindo o acesso ao log de forma local e também remotamente, uma interface gráfica possibilita que administradores de sistema visualizem detalhes das diferentes mensagens registradas.
Figura 1: Visualizador de Eventos do Windows 7
OBSERVAÇÃO: Em computadores com o Windows 7 instalado, o Visualizador de Eventos pode ser acessado a partir do menu Iniciar > Ferramentas Administrativas > Visualizador de Eventos.
O objetivo deste artigo é justamente demonstrar como informações podem ser gravadas no Event Viewer do Windows. Buscando cumprir essa meta, serão apresentados alguns exemplos de código que fazem uso de estruturas do .NET voltadas a demandas deste tipo.
Manipulando informações do Event Viewer em .NET
Os recursos que permitem a gravação de informações no Visualizador de Eventos do Windows existem desde a versão 2.0 do .NET Framework, encontrando-se definidos no namespace System.Diagnostics. O exemplo aqui abordado faz uso das seguintes estruturas:
- EventLog: classe que disponibiliza funcionalidades para que aplicações .NET interajam com o Event Viewer, com isto acontecendo através da gravação de mensagens (também conhecidas como entradas/entries) ou, até mesmo, a partir da leitura de informações de log previamente registradas;
- EventLogEntryType: enumeration que identifica o tipo de um registro armazenado no log de eventos.
Na Tabela 1 estão indicados os valores possíveis para o enumeration EventLogEntryType.
| Valor | Descrição |
| Error | Indica a ocorrência de algum erro como perda de dados ou falha na execução de uma funcionalidade. |
| Warning | Embora não seja propriamente uma falha, mensagens deste tipo representam alertas de problemas que podem resultar em erros no futuro. |
| Information | Entrada de caráter informativo, indicando normalmente a ocorrência com sucesso de um determinado evento. |
| SuccessAudit | Comumente associado a eventos de segurança, pode ser utilizado para registrar que uma tentativa de logon foi bem sucedida. |
| FailureAudit | Também relativo a questões de segurança, este valor indica que uma operação não teve êxito. Um exemplo disto é a tentativa de acesso a um arquivo para o qual não se possui permissão. |
Tabela 1: Valores possíveis para o enumeration EventLogEntryType
Na Listagem 1 é apresentada a implementação da classe estática EventViewerHelper. Este tipo utiliza os mecanismos de log já mencionados nesta seção, sendo que a gravação de informações descrevendo eventos de uma aplicação acontecerá por meio da operação RegistrarMensagem.
Quanto ao funcionamento do método estático RegistrarMensagem, é possível destacar:
- Essa construção receberá como informações a aplicação que originou a entraada no log (parâmetro “origemMensagem”), o conteúdo da mensagem em questão (parâmetro “conteudoMensagem”) e ainda, o tipo da mensagem (parâmetro “tipoMensagem”);
- Inicialmente é invocado o método SourceExists da classe EventLog. Esta ação tem por objetivo determinar se a origem das mensagens (nome da aplicação) já está cadastrada no Event Viewer;
- Caso o retorno da operação SourceExists seja falso, é realizada então uma chamada ao método CreateEventSource, para que assim se crie as informações necessárias para a gravação dos registros de log. CreateEventSource recebe como parâmetros o nome da aplicação em que é gerando o log, além da identificação da seção em que constarão tais mensagens (o valor “Application” indica que ao se acessar o Visualizador de Eventos os registros estarão visíveis a partir de um item chamado “Aplicação”, considerando para isto que o Windows esteja configurado para o idioma português);
- Por fim, uma instância do tipo EventLog é criada. A propriedade Source deste objeto é preenchida com o nome da aplicação e, em seguida, é realizada uma chamada ao método WriteEntry. Esta última operação recebe como parâmetros o conteúdo da mensagem a ser persistida, bem como o tipo correspondente (enumeration EventLogEntryType).
Listagem 1: Classe EventViewerHelper
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace TesteEventViewer
{
public static class EventViewerHelper
{
public static void RegistrarMensagem(
string origemMensagem,
string conteudoMensagem,
EventLogEntryType tipoMensagem)
{
if (!EventLog.SourceExists(origemMensagem))
{
EventLog.CreateEventSource(
origemMensagem,
"Application");
}
EventLog log = new EventLog();
log.Source = origemMensagem;
log.WriteEntry(conteudoMensagem, tipoMensagem);
}
}
}
A Listagem 2 apresenta um exemplo de utilização da classe EventViewerHelper. O método Main desta aplicação aciona o método RegistrarMensagem, visando com isto gravar no log do Windows uma notificação de que o sistema considerado foi executado num determinado momento (conforme indicado na Figura 2).
Listagem 2: Exemplo de trecho de código que faz uso da classe EventViewerHelper
Figura 2: Mensagem de log gravada no Event Viewer
OBSERVAÇÃO: caso se realizem testes a partir do Visual Studio e que envolvam a gravação de informações no Event Viewer, executar este aplicativo como “Administrador”, pois do contrário ocorrerá uma falha de segurança.
Conclusão
Procurei com este artigo demonstrar como o mecanismo de log do Windows pode ser usado a partir de aplicações .NET. Este recurso pode ser particularmente útil em soluções que envolvam a implementação de serviços executados periodicamente; a gravação de informações no Event Viewer ajudaria então administradores de sistema a monitorarem os softwares ativos, conseguindo assim determinar se a operação dos mesmos está dentro do esperado.
Outra consideração importante a ser feita é a respeito do que deverá ou não ser salvo no Visualizador de Eventos. Para a gravação de informações que envolvam operações realizadas numa base relacional, recomenda-se o uso de uma tabela no próprio banco; esta medida contribui para evitar um volume grande de mensagens, sendo que muitas não acrescentariam detalhes significativos aos responsáveis por acompanhar o funcionamento de um software.
Espero que o conteúdo aqui abordado possa lhe auxiliar em algum momento. Até uma próxima oportunidade!
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo