From: <fab...@us...> - 2010-08-09 13:03:42
|
Revision: 5132 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5132&view=rev Author: fabiomaulo Date: 2010-08-09 13:03:36 +0000 (Mon, 09 Aug 2010) Log Message: ----------- End logging abstraction : fix NH-1554 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Logging.cs trunk/nhibernate/src/NHibernate.Test/Logging/LoggerProviderTest.cs Modified: trunk/nhibernate/src/NHibernate/Logging.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Logging.cs 2010-08-09 11:43:36 UTC (rev 5131) +++ trunk/nhibernate/src/NHibernate/Logging.cs 2010-08-09 13:03:36 UTC (rev 5132) @@ -1,4 +1,7 @@ using System; +using System.Configuration; +using System.IO; +using System.Linq; using System.Linq.Expressions; namespace NHibernate @@ -38,14 +41,64 @@ public class LoggerProvider { + private const string NhibernateLoggerConfKey = "nhibernate-logger"; private readonly ILoggerFactory loggerFactory; private static LoggerProvider instance; static LoggerProvider() { - SetLoggersFactory(new Log4NetLoggerFactory()); + string nhibernateLoggerClass = GetNhibernateLoggerClass(); + ILoggerFactory loggerFactory = string.IsNullOrEmpty(nhibernateLoggerClass) ? new NoLoggingLoggerFactory() : GetLoggerFactory(nhibernateLoggerClass); + SetLoggersFactory(loggerFactory); } + private static ILoggerFactory GetLoggerFactory(string nhibernateLoggerClass) + { + ILoggerFactory loggerFactory; + var loggerFactoryType = System.Type.GetType(nhibernateLoggerClass); + try + { + loggerFactory = (ILoggerFactory) Activator.CreateInstance(loggerFactoryType); + } + catch (MissingMethodException ex) + { + throw new ApplicationException("Public constructor was not found for " + loggerFactoryType, ex); + } + catch (InvalidCastException ex) + { + throw new ApplicationException(loggerFactoryType + "Type does not implement " + typeof (ILoggerFactory), ex); + } + catch (Exception ex) + { + throw new ApplicationException("Unable to instantiate: " + loggerFactoryType, ex); + } + return loggerFactory; + } + + private static string GetNhibernateLoggerClass() + { + var nhibernateLogger = ConfigurationManager.AppSettings.Keys.Cast<string>().FirstOrDefault(k => NhibernateLoggerConfKey.Equals(k.ToLowerInvariant())); + string nhibernateLoggerClass = null; + if (string.IsNullOrEmpty(nhibernateLogger)) + { + // 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"); + + if (File.Exists(log4NetDllPath)) + { + nhibernateLoggerClass = typeof (Log4NetLoggerFactory).AssemblyQualifiedName; + } + } + else + { + nhibernateLoggerClass = ConfigurationManager.AppSettings[nhibernateLogger]; + } + return nhibernateLoggerClass; + } + public static void SetLoggersFactory(ILoggerFactory loggerFactory) { instance = new LoggerProvider(loggerFactory); @@ -67,6 +120,104 @@ } } + public class NoLoggingLoggerFactory: ILoggerFactory + { + private static readonly ILogger Nologging = new NoLoggingLogger(); + public ILogger LoggerFor(string keyName) + { + return Nologging; + } + + public ILogger LoggerFor(System.Type type) + { + return Nologging; + } + } + + public class NoLoggingLogger: ILogger + { + public bool IsErrorEnabled + { + get { return false;} + } + + public bool IsFatalEnabled + { + get { return false; } + } + + public bool IsDebugEnabled + { + get { return false; } + } + + public bool IsInfoEnabled + { + get { return false; } + } + + public bool IsWarnEnabled + { + get { return false; } + } + + public void Error(object message) + { + } + + public void Error(object message, Exception exception) + { + } + + public void ErrorFormat(string format, params object[] args) + { + } + + public void Fatal(object message) + { + } + + public void Fatal(object message, Exception exception) + { + } + + public void Debug(object message) + { + } + + public void Debug(object message, Exception exception) + { + } + + public void DebugFormat(string format, params object[] args) + { + } + + public void Info(object message) + { + } + + public void Info(object message, Exception exception) + { + } + + public void InfoFormat(string format, params object[] args) + { + } + + public void Warn(object message) + { + } + + public void Warn(object message, Exception exception) + { + } + + public void WarnFormat(string format, params object[] args) + { + } + } + public class Log4NetLoggerFactory: ILoggerFactory { private static readonly System.Type LogManagerType = System.Type.GetType("log4net.LogManager, log4net"); Modified: trunk/nhibernate/src/NHibernate.Test/Logging/LoggerProviderTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Logging/LoggerProviderTest.cs 2010-08-09 11:43:36 UTC (rev 5131) +++ trunk/nhibernate/src/NHibernate.Test/Logging/LoggerProviderTest.cs 2010-08-09 13:03:36 UTC (rev 5132) @@ -9,7 +9,13 @@ public void LoggerProviderCanCreateLoggers() { LoggerProvider.LoggerFor("pizza").Should().Not.Be.Null(); - LoggerProvider.LoggerFor(typeof(LoggerProviderTest)).Should().Not.Be.Null(); + LoggerProvider.LoggerFor(typeof (LoggerProviderTest)).Should().Not.Be.Null(); } + + [Test] + public void WhenNotConfiguredAndLog4NetExistsThenUseLog4NetFactory() + { + LoggerProvider.LoggerFor("pizza").Should().Be.InstanceOf<Log4NetLogger>(); + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |