Lesser-Known NHibernate Features: Custom Loggers

Extensible as it is, it's no wonder that NHibernate also supports injecting custom loggers. The support is twofold:

  • There's the ILoggerFactory interface, that must be implemented by custom logger factories; this is the responsible for creating actual loggers;
  • Then there's the IInternalLogger interface, the one that provides the common functions found in most loggers (warn, info, debug, error, fatal, etc).

By default, it uses Log4Net, but it is easy to add our own logger.

So, let's start by implementing a logger factory - just the skeleton, I leave it to you as an exercise:

public class CustomLoggerFactory : ILoggerFactory
{
    public IInternalLogger LoggerFor(Type type)
    {
        return new CustomLogger(type.FullName);
    }
 
    public IInternalLogger LoggerFor(String keyName)
    {
        return new CustomLogger(keyName);
    }
}

And then the actual logger:

public class CustomLogger : IInternalLogger
{
    public String Key { get; private set; }
 
    public CustomLogger(String key)
    {
        this.Key = key;
    }
 
    public void Debug(Object message, Exception exception)
    {
    }
 
    public void Debug(Object message)
    {
    }
 
    public void DebugFormat(String format, params Object[] args)
    {
    }
 
    public void Error(Object message, Exception exception)
    {
    }
 
    public void Error(Object message)
    {
    }
 
    public void ErrorFormat(String format, params Object[] args)
    {
    }
 
    public void Fatal(Object message, Exception exception)
    {
    }
 
    public void Fatal(Object message)
    {
    }
 
    public void Info(Object message, Exception exception)
    {
    }
 
    public void Info(Object message)
    {
    }
 
    public void InfoFormat(String format, params Object[] args)
    {
    }
 
    public Boolean IsDebugEnabled
    {
        get { return true; }
    }
 
    public Boolean IsErrorEnabled
    {
        get { return true; }
    }
 
    public Boolean IsFatalEnabled
    {
        get { return true; }
    }
 
    public Boolean IsInfoEnabled
    {
        get { return true; }
    }
 
    public Boolean IsWarnEnabled
    {
        get { return true; }
    }
 
    public void Warn(Object message, Exception exception)
    {
    }
 
    public void Warn(Object message)
    {
    }
 
    public void WarnFormat(String format, params Object[] args)
    {
    }
}

Remember, this is just a skeleton, do implement these methods anyway you like.

Now, all that is left is the registration:

LoggerProvider.SetLoggersFactory(new CustomLoggerFactory());

And NHibernate will start logging using your logger!

PS - Issue NH-3776 is an attempt to make using logger factories even simpler and in a similar fashion to other pluggable features.

                             

1 Comment

  • Really nice solution. A time ago I just wanted to log the queries in a ASP.NET application in the Visual Studio Output and came up with a different solution: http://blog.denouter.net/2014/05/nhibernate-logging-in-visual-studio.html

Add a Comment

As it will appear on the website

Not displayed

Your website