[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.