[NHibernate] Integracja z NLog

Chcesz logować SQL generowany przez NHibernate do pliku?
Przejdę od razu do konkretów. Potrzeba klasy NLogFactory, która będzie tworzyła instancje Loggera.
[code lang=”csharp”]
public class NLogFactory : ILoggerFactory
{
#region ILoggerFactory Members
public IInternalLogger LoggerFor(Type type)
{
return new NLogLogger(LogManager.GetLogger(type.FullName));
}
public IInternalLogger LoggerFor(string keyName)
{
return new NLogLogger(LogManager.GetLogger(keyName));
}
#endregion
}
[/code]
Potrzeba klasę, która jest adapterem dla NLoga – NLogLogger
[code lang=”csharp”]
public class NLogLogger : IInternalLogger
{
private readonly Logger logger;
public NLogLogger(Logger logger)
{
this.logger = logger;
}
#region Properties
public bool IsDebugEnabled { get { return logger.IsDebugEnabled; } }
public bool IsErrorEnabled { get { return logger.IsErrorEnabled; } }
public bool IsFatalEnabled { get { return logger.IsFatalEnabled; } }
public bool IsInfoEnabled { get { return logger.IsInfoEnabled; } }
public bool IsWarnEnabled { get { return logger.IsWarnEnabled; } }
#endregion
#region IInternalLogger Methods
public void Debug(object message, Exception exception)
{
logger.Debug(exception, message.ToString());
}
public void Debug(object message)
{
logger.Debug(message.ToString());
}
public void DebugFormat(string format, params object[] args)
{
logger.Debug(String.Format(format, args));
}
public void Error(object message, Exception exception)
{
logger.Error(exception, message.ToString());
}
public void Error(object message)
{
logger.Error(message.ToString());
}
public void ErrorFormat(string format, params object[] args)
{
logger.Error(String.Format(format, args));
}
public void Fatal(object message, Exception exception)
{
logger.Fatal(exception, message.ToString());
}
public void Fatal(object message)
{
logger.Fatal(message.ToString());
}
public void Info(object message, Exception exception)
{
logger.Info(exception, message.ToString());
}
public void Info(object message)
{
logger.Info(message.ToString());
}
public void InfoFormat(string format, params object[] args)
{
logger.Info(String.Format(format, args));
}
public void Warn(object message, Exception exception)
{
logger.Warn(exception, message.ToString());
}
public void Warn(object message)
{
logger.Warn(message.ToString());
}
public void WarnFormat(string format, params object[] args)
{
logger.Warn(String.Format(format, args));
}
#endregion
}
[/code]
Na koniec trzeba zmodyfikować plik web.config (lub app.config w przypadku aplikacji desktopowej)
w sekcji configuration/appSettings dodać
[code lang=”xml”]
<add key="nhibernate-logger" value="YourNamespace.ChangeThis.NLogFactory, YourAssemblyName" />
[/code]
Pamiętaj o zmianie namespace (przestrzeni nazw) oraz nazwy Assembly.
Pozostało jeszcze skonfigurać nLoga:
w sekcji configuration/nlog/targets dodać:
[code lang=”xml”]
<target type="File" name="sql" fileName="${basedir}\logs\sql.${shortdate}.log" keepFileOpen="false" />
[/code]
a w sekcji configuration/nlog/rules dodać:
[code lang=”xml”]
<logger name="NHibernate.SQL" minlevel="Debug" writeTo="sql" />
[/code]
I wszystko powinno śmigać i logować do pliku, aż miło.