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