With the release of NHibernate 3.0 the way NHibernate handles logging is changed. Up to 2.1.2 NHibernate used log4net exclusive for logging. The usage of log4net was directly tied into each class of NHibernate.
Now this has been decoupled. NHibernate 3.0 introduces a LoggingProvider
. So instead of
private static readonly ILog log = LogManager.GetLogger(typeof (Loader));
a new logger is created using
private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof (Loader));
Even though this might not seem like a big deal, there is more to the LoggingProvider
. The logging provider currently only supports log4net (well, and a NoLoggingLoggerFactory
). In order to determine whether log4net is available for logging, the LoggingProvider
looks in the current SearchPath
of BaseDirectory
of the AppDomain
like this:
// look for log4net.dll string baseDir = AppDomain.CurrentDomain.BaseDirectory; string relativeSearchPath = AppDomain.CurrentDomain.RelativeSearchPath; string binPath = relativeSearchPath == null ? baseDir : Path.Combine(baseDir, relativeSearchPath); var log4NetDllPath = Path.Combine(binPath, "log4net.dll");
What go me started was the fact, the my log4net configuration wasn’t creating any log-output, and I was extremely puzzled on why. I checked my config a dozen times without any error. This was working perfectly fine when working with NHibernate 2.1.2.
After looking at the LoggingProvider
and the way logging is initialized it struck me: my log4net assembly is located in the GAC – the the lookup for log4net isn’t detecting my log4net assembly! Changing the properties of the reference to log4net to Copy Local
resolved this issue.