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.
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="
" Multiline="true" />
</Fields>
</LogLine>
</LogFormat>