nicko 2005/06/21 12:11:57
Modified: src/Core LoggerManager.cs
Log:
Fix for LOG4NET-37. Allow the RepositorySelector type to be sepecified using
the AppSettings config
Revision Changes Path
1.9 +65 -3 logging-log4net/src/Core/LoggerManager.cs
Index: LoggerManager.cs
===================================================================
RCS file: /home/cvs/logging-log4net/src/Core/LoggerManager.cs,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- LoggerManager.cs 17 Jan 2005 20:18:43 -0000 1.8
+++ LoggerManager.cs 21 Jun 2005 19:11:57 -0000 1.9
@@ -17,7 +17,7 @@
#endregion
using System;
-using System.Collections;
+using System.Configuration;
using System.Reflection;
using log4net.Util;
@@ -36,6 +36,13 @@
/// This class is used by the wrapper managers (e.g. <see
cref="log4net.LogManager"/>)
/// to provide access to the <see cref="ILogger"/> objects.
/// </para>
+ /// <para>
+ /// This manager also holds the <see cref="IRepositorySelector"/> that
is used to
+ /// lookup and create repositories. The selector can be set either
programmatically using
+ /// the <see cref="RepositorySelector"/> property, or by setting the
<c>log4net.RepositorySelector</c>
+ /// AppSetting in the applications config file to the fully qualified
type name of the
+ /// selector to use.
+ /// </para>
/// </remarks>
/// <author>Nicko Cadell</author>
/// <author>Gert Driesen</author>
@@ -80,7 +87,7 @@
}
catch(System.Security.SecurityException)
{
- LogLog.Debug("LoggerMAnager: Security Exception
(ControlAppDomain LinkDemand) while trying "+
+ LogLog.Debug("LoggerManager: Security Exception
(ControlAppDomain LinkDemand) while trying "+
"to register Shutdown handler with the
AppDomain. LoggerManager.Shutdown() "+
"will not be called automatically when
the AppDomain exits. It must be called "+
"programmatically.");
@@ -93,7 +100,62 @@
#if NETCF
s_repositorySelector = new
CompactRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy));
#else
- s_repositorySelector = new
DefaultRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy));
+
+ // Look for the RepositorySelector type specified in
the AppSettings 'log4net.RepositorySelector'
+ string appRepositorySelectorTypeName = null;
+
+ try
+ {
+ appRepositorySelectorTypeName =
ConfigurationSettings.AppSettings["log4net.RepositorySelector"];
+ }
+ catch(Exception ex)
+ {
+ // If an exception is thrown here then it looks
like the config file does not parse correctly.
+ LogLog.Error("LoggerManager: Exception while
reading ConfigurationSettings. Check your .config file is well formed XML.",
ex);
+ }
+
+ if (appRepositorySelectorTypeName != null &&
appRepositorySelectorTypeName.Length > 0)
+ {
+ // Resolve the config string into a Type
+ Type appRepositorySelectorType = null;
+ try
+ {
+ appRepositorySelectorType =
SystemInfo.GetTypeFromString(appRepositorySelectorTypeName, false, true);
+ }
+ catch(Exception ex)
+ {
+ LogLog.Error("LoggerManager: Exception
while resolving RepositorySelector Type ["+appRepositorySelectorTypeName+"]",
ex);
+ }
+
+ if (appRepositorySelectorType != null)
+ {
+ // Create an instance of the
RepositorySelectorType
+ object appRepositorySelectorObj = null;
+ try
+ {
+ appRepositorySelectorObj =
Activator.CreateInstance(appRepositorySelectorType);
+ }
+ catch(Exception ex)
+ {
+ LogLog.Error("LoggerManager:
Exception while creating RepositorySelector
["+appRepositorySelectorType.FullName+"]", ex);
+ }
+
+ if (appRepositorySelectorObj != null &&
appRepositorySelectorObj is IRepositorySelector)
+ {
+ s_repositorySelector =
(IRepositorySelector)appRepositorySelectorObj;
+ }
+ else
+ {
+ LogLog.Error("LoggerManager:
RepositorySelector Type ["+appRepositorySelectorType.FullName+"] is not an
IRepositorySelector");
+ }
+ }
+ }
+
+ // Create the DefaultRepositorySelector if not
configured above
+ if (s_repositorySelector == null)
+ {
+ s_repositorySelector = new
DefaultRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy));
+ }
#endif
}