Como usar o NLog e o Common.Logging com Nhibernate

Neste artigo vamos mostrar como adicionar logging a uma aplicação usando o NLog em conjunto com o Common.Logging. Vamos também explicar como configurar o logging em Nhibernate.

Introdução

  • NLog é uma plataforma de logging. Trata de fazer o logging em si.
  • Common.Logging é uma interface para a plataforma de logging. Uma abstração para que quando precisem de mudar de plataforma de logging apenas tenham de mudar a configuração.
  • Nhibernate é um mapeador objectos-relacional. Podem ignorar esta parte se não o usarem.

Instalar as frameworks

O primeiro passo é instalar as assemblies necessárias. Vão precisar de:

  • NLog
  • NLog Configuration
  • NLog Schema for Intellisense(TM)
  • Common.Logging
  • Common.Logging.NLog20 (se usarem a versão 2 do NLog)
  • Nhibernate.Logging (se usarem Nhibernate)

Podem fazê-lo através do NuGet ou fazendo download a partir dos respectivos websites.

NuGet NLog
NuGet NLog
NuGet Common.Logging
NuGet Common.Logging
NuGet Nhibernate.Logging
NuGet Nhibernate.Logging

Configurar o NLog

Devem ter um ficheiro NLog.config na raiz do vosso projecto.

Por omissão vem com umas linhas comentadas. Podem usar essas linhas para terem um log simples ou personalizá-las às vossas necessidades.

Eis outro exemplo:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <targets>
  <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
   layout="${longdate} ${logger} ${uppercase:${level}} ${message} ${exception:format=ToString,StackTrace,method:maxInnerExceptionLevel=5:innerFormat=ToString}" />
 </targets>
 <rules>
  <logger name="NHibernate.SQL" minlevel="Debug" writeTo="f" final="true" />
  <logger name="NHibernate.*" minlevel="Warn" writeTo="f" final="true" />
  <logger name="*" minlevel="Trace" writeTo="f" />
 </rules>
</nlog>

Primeiro definimos os targets. Neste caso vamos guardar o log num ficheiro e usamos a data como nome do ficheiro.

O layout especifica o que será gravado:

  • longdate: a data completa.
  • logger: o nome da fonte.
  • level: o nível do log (e.g. info, debug, error)
  • message: a mensagem guardada.
  • exception: informação de excepções. Neste exemplo usamos um formato específico e também escrevemos a stack trace e até 5 excepções interiores.

Depois especificamos as regras de routing. Temos duas regras para Nhibernate (senão os ficheiros de log vão fichar cheios) e também uma regra geral para as outras fontes.

Podem verificar a documentação de como configurar o NLog para mais informação.

Configurar o Common.Logging

Podem configurar o Common.Logging no ficheiro App.config, onde já deverá estar incluída informação das assemblies.

Precisam de adicionar uma secção para o Common.Logging e também definir um factory adapter. Neste caso, para usar em conjunto com o NLog:

<configuration>
 <configSections>
  <sectionGroup name="common">
   <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
  </sectionGroup>
 </configSections>
 <common>
  <logging>
   <factoryAdapter type="Common.Logging.NLog.NLogLoggerFactoryAdapter, Common.Logging.NLog20">
    <arg key="configType" value="FILE" />
    <arg key="configFile" value="~/NLog.config" />
   </factoryAdapter>
  </logging>
 </common>
 <runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
   <dependentAssembly>
    <assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0" />
   </dependentAssembly>
   <dependentAssembly>
    <assemblyIdentity name="Common.Logging" publicKeyToken="af08829b84f0328e" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
   </dependentAssembly>
  </assemblyBinding>
 </runtime>
 <appSettings>
  <add key="nhibernate-logger" value="NHibernate.Logging.CommonLogging.CommonLoggingLoggerFactory, NHibernate.Logging.CommonLogging" />
 </appSettings>
</configuration>

Também configuramos o logging para o Nhibernate.

Como guardar para o log

Agora vem a parte divertida - gravar mensagens no log!

No meu caso, defino um membro ILog no meu view model de base:

readonly ILog _log;

Depois inicializo-o no constructor do view model:

_log = LogManager.GetLogger(GetType());

E chamo-o quanto preciso de gravar qualquer coisa:

_log.Info("Test!");

Este é o output gravado no ficheiro de log:

2014-03-04 15:40:11.6753 WpfApplication1.MainWindowViewModel INFO Test! 

Visualizar os logs

Agora que têm ficheiros de logs, provavelmente vão querer uma forma melhor de os visualizar.

Algumas alternativas:

  • Legit Log Viewer: um simples visualizador de ficheiros de log. Precisam de configurar o formato do log (vejam a seguir um exemplo para o formato que foi definido anteriormente).
  • Log2Console: recebam os logs directamente numa consola à medida que são produzidos.
  • Log4View: visualizador com muitas funcionalidades.

Formato de log para o Legit Log Viewer

<LogFormat xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xmlns="http://www.legitlog.com/LogFormatSchema.xsd"
       FormatName="NLog">
  <Description>
    ${longdate} ${logger} ${uppercase:${level}} ${message} ${exception}
  </Description>
  <LogLine>
  <Fields>
        <LogFieldFormat Name="DateTime" FieldType="DateTime" Delimiter=" " Format="yyyy-MM-dd HH:mm:ss.ffff" />
        <LogFieldFormat Name="Logger" FieldType="String" Delimiter=" " />
        <LogFieldFormat Name="Level" FieldType="String" Delimiter=" " FilterColumn="true" HighlightRows="true" />
        <LogFieldFormat Name="Message" FieldType="String" Delimiter="&#xD;&#xA;" Multiline="true" />
  </Fields>
  </LogLine>
</LogFormat>

Artigos relacionados