From 2da97f1303f2882db18f7eca02f4863d1e3254ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BD=AD=E4=BC=9F?= Date: Fri, 10 Aug 2018 11:23:17 +0800 Subject: [PATCH 1/2] Allow DI to create instance --- src/Appender/AdoNetAppender.cs | 2 +- src/Config/PluginAttribute.cs | 2 +- .../SecurityContextProviderAttribute.cs | 2 +- src/Core/CompactRepositorySelector.cs | 2 +- src/Core/DefaultRepositorySelector.cs | 2 +- src/Core/LoggerManager.cs | 109 +++++++----- .../Hierarchy/XmlHierarchyConfigurator.cs | 160 +++++++++--------- src/Util/OptionConverter.cs | 2 +- src/Util/PatternParser.cs | 2 +- src/Util/TypeConverters/ConverterRegistry.cs | 5 +- 10 files changed, 155 insertions(+), 133 deletions(-) diff --git a/src/Appender/AdoNetAppender.cs b/src/Appender/AdoNetAppender.cs index 061aece9..dc23df0d 100644 --- a/src/Appender/AdoNetAppender.cs +++ b/src/Appender/AdoNetAppender.cs @@ -631,7 +631,7 @@ virtual protected string GetLogStatement(LoggingEvent logEvent) /// An instance with a valid connection string. virtual protected IDbConnection CreateConnection(Type connectionType, string connectionString) { - IDbConnection connection = (IDbConnection)Activator.CreateInstance(connectionType); + IDbConnection connection = (IDbConnection)LoggerManager.GetService(connectionType); connection.ConnectionString = connectionString; return connection; } diff --git a/src/Config/PluginAttribute.cs b/src/Config/PluginAttribute.cs index eb919068..a9464b51 100644 --- a/src/Config/PluginAttribute.cs +++ b/src/Config/PluginAttribute.cs @@ -156,7 +156,7 @@ public IPlugin CreatePlugin() } // Create an instance of the plugin using the default constructor - IPlugin plugin = (IPlugin)Activator.CreateInstance(pluginType); + IPlugin plugin = (IPlugin)LoggerManager.GetService(pluginType); return plugin; } diff --git a/src/Config/SecurityContextProviderAttribute.cs b/src/Config/SecurityContextProviderAttribute.cs index c6f85572..222b5eb3 100644 --- a/src/Config/SecurityContextProviderAttribute.cs +++ b/src/Config/SecurityContextProviderAttribute.cs @@ -112,7 +112,7 @@ override public void Configure(Assembly sourceAssembly, ILoggerRepository target { LogLog.Debug(declaringType, "Creating provider of type ["+ m_providerType.FullName +"]"); - SecurityContextProvider provider = Activator.CreateInstance(m_providerType) as SecurityContextProvider; + SecurityContextProvider provider = LoggerManager.GetService(m_providerType) as SecurityContextProvider; if (provider == null) { diff --git a/src/Core/CompactRepositorySelector.cs b/src/Core/CompactRepositorySelector.cs index dd46f6d5..dde31fe7 100644 --- a/src/Core/CompactRepositorySelector.cs +++ b/src/Core/CompactRepositorySelector.cs @@ -244,7 +244,7 @@ public ILoggerRepository CreateRepository(string repositoryName, Type repository LogLog.Debug(declaringType, "Creating repository ["+repositoryName+"] using type ["+repositoryType+"]"); // Call the no arg constructor for the repositoryType - rep = (ILoggerRepository)Activator.CreateInstance(repositoryType); + rep = (ILoggerRepository)LoggerManager.GetService(repositoryType); // Set the name of the repository rep.Name = repositoryName; diff --git a/src/Core/DefaultRepositorySelector.cs b/src/Core/DefaultRepositorySelector.cs index 970f296e..b67e4ec5 100644 --- a/src/Core/DefaultRepositorySelector.cs +++ b/src/Core/DefaultRepositorySelector.cs @@ -413,7 +413,7 @@ public ILoggerRepository CreateRepository(string repositoryName, Type repository LogLog.Debug(declaringType, "Creating repository [" + repositoryName + "] using type [" + repositoryType + "]"); // Call the no arg constructor for the repositoryType - rep = (ILoggerRepository)Activator.CreateInstance(repositoryType); + rep = (ILoggerRepository)LoggerManager.GetService(repositoryType); // Set the name of the repository rep.Name = repositoryName; diff --git a/src/Core/LoggerManager.cs b/src/Core/LoggerManager.cs index 8ffaad2f..cb0a3936 100644 --- a/src/Core/LoggerManager.cs +++ b/src/Core/LoggerManager.cs @@ -1,10 +1,10 @@ #region Apache License // -// Licensed to the Apache Software Foundation (ASF) under one or more +// Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. +// this work for additional information regarding copyright ownership. // The ASF licenses this file to you under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with +// (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 @@ -46,7 +46,7 @@ namespace log4net.Core /// lookup and create repositories. The selector can be set either programmatically using /// the property, or by setting the log4net.RepositorySelector /// AppSetting in the applications config file to the fully qualified type name of the - /// selector to use. + /// selector to use. /// /// /// Nicko Cadell @@ -63,7 +63,7 @@ public sealed class LoggerManager /// Private constructor to prevent instances. Only static methods should be used. /// /// - private LoggerManager() + private LoggerManager() { } @@ -76,8 +76,8 @@ private LoggerManager() /// /// /// - /// On the full .NET runtime, the static constructor hooks up the - /// AppDomain.ProcessExit and AppDomain.DomainUnload> events. + /// On the full .NET runtime, the static constructor hooks up the + /// AppDomain.ProcessExit and AppDomain.DomainUnload> events. /// These are used to shutdown the log4net system as the application exits. /// /// @@ -127,7 +127,7 @@ static LoggerManager() object appRepositorySelectorObj = null; try { - appRepositorySelectorObj = Activator.CreateInstance(appRepositorySelectorType); + appRepositorySelectorObj = LoggerManager.GetService(appRepositorySelectorType); } catch(Exception ex) { @@ -145,7 +145,7 @@ static LoggerManager() } } #endif - // Create the DefaultRepositorySelector if not configured above + // Create the DefaultRepositorySelector if not configured above if (s_repositorySelector == null) { s_repositorySelector = new DefaultRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy)); @@ -175,22 +175,41 @@ private static void RegisterAppDomainEvents() #endif } - #endregion Static Constructor + #endregion Static Constructor - #region Public Static Methods + #region Public Static Property - /// - /// Return the default instance. - /// - /// the repository to lookup in - /// Return the default instance - /// - /// - /// Gets the for the repository specified - /// by the argument. - /// - /// - [Obsolete("Use GetRepository instead of GetLoggerRepository")] + /// + /// Get the instance of the type. + /// + public static Func GetService + { + get => _getService; + set + { + if (value == null) + throw new ArgumentNullException("value"); + + _getService = value; + } + } + + #endregion + + #region Public Static Methods + + /// + /// Return the default instance. + /// + /// the repository to lookup in + /// Return the default instance + /// + /// + /// Gets the for the repository specified + /// by the argument. + /// + /// + [Obsolete("Use GetRepository instead of GetLoggerRepository")] public static ILoggerRepository GetLoggerRepository(string repository) { return GetRepository(repository); @@ -262,7 +281,7 @@ public static ILoggerRepository GetRepository(Assembly repositoryAssembly) /// null. /// /// - public static ILogger Exists(string repository, string name) + public static ILogger Exists(string repository, string name) { if (repository == null) { @@ -291,7 +310,7 @@ public static ILogger Exists(string repository, string name) /// null. /// /// - public static ILogger Exists(Assembly repositoryAssembly, string name) + public static ILogger Exists(Assembly repositoryAssembly, string name) { if (repositoryAssembly == null) { @@ -404,7 +423,7 @@ public static ILogger GetLogger(Assembly repositoryAssembly, string name) throw new ArgumentNullException("name"); } return RepositorySelector.GetRepository(repositoryAssembly).GetLogger(name); - } + } /// /// Shorthand for . @@ -417,7 +436,7 @@ public static ILogger GetLogger(Assembly repositoryAssembly, string name) /// Gets the logger for the fully qualified name of the type specified. /// /// - public static ILogger GetLogger(string repository, Type type) + public static ILogger GetLogger(string repository, Type type) { if (repository == null) { @@ -441,7 +460,7 @@ public static ILogger GetLogger(string repository, Type type) /// Gets the logger for the fully qualified name of the type specified. /// /// - public static ILogger GetLogger(Assembly repositoryAssembly, Type type) + public static ILogger GetLogger(Assembly repositoryAssembly, Type type) { if (repositoryAssembly == null) { @@ -452,7 +471,7 @@ public static ILogger GetLogger(Assembly repositoryAssembly, Type type) throw new ArgumentNullException("type"); } return RepositorySelector.GetRepository(repositoryAssembly).GetLogger(type.FullName); - } + } /// /// Shuts down the log4net system. @@ -464,7 +483,7 @@ public static ILogger GetLogger(Assembly repositoryAssembly, Type type) /// default repositories. /// /// - /// Some appenders need to be closed before the application exists. + /// Some appenders need to be closed before the application exists. /// Otherwise, pending logging events might be lost. /// /// @@ -474,7 +493,7 @@ public static ILogger GetLogger(Assembly repositoryAssembly, Type type) /// and again to a nested appender. /// /// - public static void Shutdown() + public static void Shutdown() { foreach(ILoggerRepository repository in GetAllRepositories()) { @@ -493,7 +512,7 @@ public static void Shutdown() /// repository for the specified. /// /// - /// Some appenders need to be closed before the application exists. + /// Some appenders need to be closed before the application exists. /// Otherwise, pending logging events might be lost. /// /// @@ -503,7 +522,7 @@ public static void Shutdown() /// and again to a nested appender. /// /// - public static void ShutdownRepository(string repository) + public static void ShutdownRepository(string repository) { if (repository == null) { @@ -524,7 +543,7 @@ public static void ShutdownRepository(string repository) /// the specified. /// /// - /// Some appenders need to be closed before the application exists. + /// Some appenders need to be closed before the application exists. /// Otherwise, pending logging events might be lost. /// /// @@ -534,7 +553,7 @@ public static void ShutdownRepository(string repository) /// and again to a nested appender. /// /// - public static void ShutdownRepository(Assembly repositoryAssembly) + public static void ShutdownRepository(Assembly repositoryAssembly) { if (repositoryAssembly == null) { @@ -555,9 +574,9 @@ public static void ShutdownRepository(Assembly repositoryAssembly) /// sets their additivity flag to true and sets the level /// of the root logger to . Moreover, /// message disabling is set its default "off" value. - /// + /// /// - public static void ResetConfiguration(string repository) + public static void ResetConfiguration(string repository) { if (repository == null) { @@ -578,9 +597,9 @@ public static void ResetConfiguration(string repository) /// sets their additivity flag to true and sets the level /// of the root logger to . Moreover, /// message disabling is set its default "off" value. - /// + /// /// - public static void ResetConfiguration(Assembly repositoryAssembly) + public static void ResetConfiguration(Assembly repositoryAssembly) { if (repositoryAssembly == null) { @@ -765,13 +784,13 @@ public static ILoggerRepository[] GetAllRepositories() /// /// /// - /// The repository selector () is used by - /// the to create and select repositories + /// The repository selector () is used by + /// the to create and select repositories /// (). /// /// - /// The caller to supplies either a string name - /// or an assembly (if not supplied the assembly is inferred using + /// The caller to supplies either a string name + /// or an assembly (if not supplied the assembly is inferred using /// ). /// /// @@ -875,6 +894,8 @@ private static void OnProcessExit(object sender, EventArgs e) /// private static IRepositorySelector s_repositorySelector; - #endregion Private Static Fields + private static Func _getService = Activator.CreateInstance; + + #endregion Private Static Fields } } diff --git a/src/Repository/Hierarchy/XmlHierarchyConfigurator.cs b/src/Repository/Hierarchy/XmlHierarchyConfigurator.cs index f5021c10..b6867a5a 100644 --- a/src/Repository/Hierarchy/XmlHierarchyConfigurator.cs +++ b/src/Repository/Hierarchy/XmlHierarchyConfigurator.cs @@ -1,10 +1,10 @@ #region Apache License // -// Licensed to the Apache Software Foundation (ASF) under one or more +// Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. +// this work for additional information regarding copyright ownership. // The ASF licenses this file to you under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with +// (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 @@ -44,7 +44,7 @@ public class XmlHierarchyConfigurator { private enum ConfigUpdateMode { - Merge, + Merge, Overwrite } @@ -60,7 +60,7 @@ private enum ConfigUpdateMode /// with the specified . /// /// - public XmlHierarchyConfigurator(Hierarchy hierarchy) + public XmlHierarchyConfigurator(Hierarchy hierarchy) { m_hierarchy = hierarchy; m_appenderBag = new Hashtable(); @@ -79,7 +79,7 @@ public XmlHierarchyConfigurator(Hierarchy hierarchy) /// Configure the hierarchy by parsing a DOM tree of XML elements. /// /// - public void Configure(XmlElement element) + public void Configure(XmlElement element) { if (element == null || m_hierarchy == null) { @@ -116,18 +116,18 @@ public void Configure(XmlElement element) string debugAttribute = element.GetAttribute(INTERNAL_DEBUG_ATTR); LogLog.Debug(declaringType, INTERNAL_DEBUG_ATTR+" attribute [" + debugAttribute + "]."); - if (debugAttribute.Length>0 && debugAttribute != "null") - { + if (debugAttribute.Length>0 && debugAttribute != "null") + { LogLog.InternalDebugging = OptionConverter.ToBoolean(debugAttribute, true); } - else + else { LogLog.Debug(declaringType, "Ignoring " + INTERNAL_DEBUG_ATTR + " attribute."); } string confDebug = element.GetAttribute(CONFIG_DEBUG_ATTR); if (confDebug.Length>0 && confDebug != "null") - { + { LogLog.Warn(declaringType, "The \"" + CONFIG_DEBUG_ATTR + "\" attribute is deprecated."); LogLog.Warn(declaringType, "Use the \"" + INTERNAL_DEBUG_ATTR + "\" attribute instead."); LogLog.InternalDebugging = OptionConverter.ToBoolean(confDebug, true); @@ -170,23 +170,23 @@ public void Configure(XmlElement element) foreach (XmlNode currentNode in element.ChildNodes) { - if (currentNode.NodeType == XmlNodeType.Element) + if (currentNode.NodeType == XmlNodeType.Element) { XmlElement currentElement = (XmlElement)currentNode; if (currentElement.LocalName == LOGGER_TAG) { ParseLogger(currentElement); - } + } else if (currentElement.LocalName == CATEGORY_TAG) { // TODO: deprecated use of category ParseLogger(currentElement); - } + } else if (currentElement.LocalName == ROOT_TAG) { ParseRoot(currentElement); - } + } else if (currentElement.LocalName == RENDERER_TAG) { ParseRenderer(currentElement); @@ -207,7 +207,7 @@ public void Configure(XmlElement element) // Lastly set the hierarchy threshold string thresholdStr = element.GetAttribute(THRESHOLD_ATTR); LogLog.Debug(declaringType, "Hierarchy Threshold [" + thresholdStr + "]"); - if (thresholdStr.Length > 0 && thresholdStr != "null") + if (thresholdStr.Length > 0 && thresholdStr != "null") { Level thresholdLevel = (Level) ConvertStringTo(typeof(Level), thresholdStr); if (thresholdLevel != null) @@ -234,20 +234,20 @@ public void Configure(XmlElement element) /// The instance of the appender that the ref refers to. /// /// - /// Parse an XML element that represents an appender and return + /// Parse an XML element that represents an appender and return /// the appender. /// /// - protected IAppender FindAppenderByReference(XmlElement appenderRef) - { + protected IAppender FindAppenderByReference(XmlElement appenderRef) + { string appenderName = appenderRef.GetAttribute(REF_ATTR); IAppender appender = (IAppender)m_appenderBag[appenderName]; - if (appender != null) + if (appender != null) { return appender; - } - else + } + else { // Find the element with that id XmlElement element = null; @@ -264,11 +264,11 @@ protected IAppender FindAppenderByReference(XmlElement appenderRef) } } - if (element == null) + if (element == null) { - LogLog.Error(declaringType, "XmlHierarchyConfigurator: No appender named [" + appenderName + "] could be found."); + LogLog.Error(declaringType, "XmlHierarchyConfigurator: No appender named [" + appenderName + "] could be found."); return null; - } + } else { appender = ParseAppender(element); @@ -278,7 +278,7 @@ protected IAppender FindAppenderByReference(XmlElement appenderRef) } return appender; } - } + } } /// @@ -292,25 +292,25 @@ protected IAppender FindAppenderByReference(XmlElement appenderRef) /// the appender instance. /// /// - protected IAppender ParseAppender(XmlElement appenderElement) + protected IAppender ParseAppender(XmlElement appenderElement) { string appenderName = appenderElement.GetAttribute(NAME_ATTR); string typeName = appenderElement.GetAttribute(TYPE_ATTR); LogLog.Debug(declaringType, "Loading Appender [" + appenderName + "] type: [" + typeName + "]"); - try + try { #if NETSTANDARD1_3 - IAppender appender = (IAppender)Activator.CreateInstance(SystemInfo.GetTypeFromString(this.GetType().GetTypeInfo().Assembly, typeName, true, true)); + IAppender appender = (IAppender)LoggerManager.GetService(SystemInfo.GetTypeFromString(this.GetType().GetTypeInfo().Assembly, typeName, true, true)); #else - IAppender appender = (IAppender)Activator.CreateInstance(SystemInfo.GetTypeFromString(typeName, true, true)); + IAppender appender = (IAppender)LoggerManager.GetService(SystemInfo.GetTypeFromString(typeName, true, true)); #endif appender.Name = appenderName; foreach (XmlNode currentNode in appenderElement.ChildNodes) { /* We're only interested in Elements */ - if (currentNode.NodeType == XmlNodeType.Element) + if (currentNode.NodeType == XmlNodeType.Element) { XmlElement currentElement = (XmlElement)currentNode; @@ -320,7 +320,7 @@ protected IAppender ParseAppender(XmlElement appenderElement) string refName = currentElement.GetAttribute(REF_ATTR); IAppenderAttachable appenderContainer = appender as IAppenderAttachable; - if (appenderContainer != null) + if (appenderContainer != null) { LogLog.Debug(declaringType, "Attaching appender named [" + refName + "] to appender named [" + appender.Name + "]."); @@ -329,8 +329,8 @@ protected IAppender ParseAppender(XmlElement appenderElement) { appenderContainer.AddAppender(referencedAppender); } - } - else + } + else { LogLog.Error(declaringType, "Requesting attachment of appender named ["+refName+ "] to appender named [" + appender.Name + "] which does not implement log4net.Core.IAppenderAttachable."); } @@ -344,15 +344,15 @@ protected IAppender ParseAppender(XmlElement appenderElement) } IOptionHandler optionHandler = appender as IOptionHandler; - if (optionHandler != null) + if (optionHandler != null) { optionHandler.ActivateOptions(); } - LogLog.Debug(declaringType, "Created Appender [" + appenderName + "]"); + LogLog.Debug(declaringType, "Created Appender [" + appenderName + "]"); return appender; } - catch (Exception ex) + catch (Exception ex) { // Yes, it's ugly. But all exceptions point to the same problem: we can't create an Appender @@ -370,7 +370,7 @@ protected IAppender ParseAppender(XmlElement appenderElement) /// Parse an XML element that represents a logger. /// /// - protected void ParseLogger(XmlElement loggerElement) + protected void ParseLogger(XmlElement loggerElement) { // Create a new log4net.Logger object from the element. string loggerName = loggerElement.GetAttribute(NAME_ATTR); @@ -381,10 +381,10 @@ protected void ParseLogger(XmlElement loggerElement) // Setting up a logger needs to be an atomic operation, in order // to protect potential log operations while logger // configuration is in progress. - lock(log) + lock(log) { bool additivity = OptionConverter.ToBoolean(loggerElement.GetAttribute(ADDITIVITY_ATTR), true); - + LogLog.Debug(declaringType, "Setting [" + log.Name + "] additivity to [" + additivity + "]."); log.Additivity = additivity; ParseChildrenOfLoggerElement(loggerElement, log, false); @@ -400,12 +400,12 @@ protected void ParseLogger(XmlElement loggerElement) /// Parse an XML element that represents the root logger. /// /// - protected void ParseRoot(XmlElement rootElement) + protected void ParseRoot(XmlElement rootElement) { Logger root = m_hierarchy.Root; // logger configuration needs to be atomic - lock(root) - { + lock(root) + { ParseChildrenOfLoggerElement(rootElement, root, true); } } @@ -421,7 +421,7 @@ protected void ParseRoot(XmlElement rootElement) /// Parse the child elements of a <logger> element. /// /// - protected void ParseChildrenOfLoggerElement(XmlElement catElement, Logger log, bool isRoot) + protected void ParseChildrenOfLoggerElement(XmlElement catElement, Logger log, bool isRoot) { // Remove all existing appenders from log. They will be // reconstructed if need be. @@ -429,10 +429,10 @@ protected void ParseChildrenOfLoggerElement(XmlElement catElement, Logger log, b foreach (XmlNode currentNode in catElement.ChildNodes) { - if (currentNode.NodeType == XmlNodeType.Element) + if (currentNode.NodeType == XmlNodeType.Element) { XmlElement currentElement = (XmlElement) currentNode; - + if (currentElement.LocalName == APPENDER_REF_TAG) { IAppender appender = FindAppenderByReference(currentElement); @@ -442,15 +442,15 @@ protected void ParseChildrenOfLoggerElement(XmlElement catElement, Logger log, b LogLog.Debug(declaringType, "Adding appender named [" + refName + "] to logger [" + log.Name + "]."); log.AddAppender(appender); } - else + else { LogLog.Error(declaringType, "Appender named [" + refName + "] not found."); } - } - else if (currentElement.LocalName == LEVEL_TAG || currentElement.LocalName == PRIORITY_TAG) + } + else if (currentElement.LocalName == LEVEL_TAG || currentElement.LocalName == PRIORITY_TAG) { - ParseLevel(currentElement, log, isRoot); - } + ParseLevel(currentElement, log, isRoot); + } else { SetParameter(currentElement, log); @@ -459,7 +459,7 @@ protected void ParseChildrenOfLoggerElement(XmlElement catElement, Logger log, b } IOptionHandler optionHandler = log as IOptionHandler; - if (optionHandler != null) + if (optionHandler != null) { optionHandler.ActivateOptions(); } @@ -474,29 +474,29 @@ protected void ParseChildrenOfLoggerElement(XmlElement catElement, Logger log, b /// Parse an XML element that represents a renderer. /// /// - protected void ParseRenderer(XmlElement element) + protected void ParseRenderer(XmlElement element) { string renderingClassName = element.GetAttribute(RENDERING_TYPE_ATTR); string renderedClassName = element.GetAttribute(RENDERED_TYPE_ATTR); LogLog.Debug(declaringType, "Rendering class [" + renderingClassName + "], Rendered class [" + renderedClassName + "]."); IObjectRenderer renderer = (IObjectRenderer)OptionConverter.InstantiateByClassName(renderingClassName, typeof(IObjectRenderer), null); - if (renderer == null) + if (renderer == null) { LogLog.Error(declaringType, "Could not instantiate renderer [" + renderingClassName + "]."); return; - } - else + } + else { - try + try { #if NETSTANDARD1_3 m_hierarchy.RendererMap.Put(SystemInfo.GetTypeFromString(this.GetType().GetTypeInfo().Assembly, renderedClassName, true, true), renderer); #else m_hierarchy.RendererMap.Put(SystemInfo.GetTypeFromString(renderedClassName, true, true), renderer); #endif - } - catch(Exception e) + } + catch(Exception e) { LogLog.Error(declaringType, "Could not find class [" + renderedClassName + "].", e); } @@ -514,30 +514,30 @@ protected void ParseRenderer(XmlElement element) /// Parse an XML element that represents a level. /// /// - protected void ParseLevel(XmlElement element, Logger log, bool isRoot) + protected void ParseLevel(XmlElement element, Logger log, bool isRoot) { string loggerName = log.Name; - if (isRoot) + if (isRoot) { loggerName = "root"; } string levelStr = element.GetAttribute(VALUE_ATTR); LogLog.Debug(declaringType, "Logger [" + loggerName + "] Level string is [" + levelStr + "]."); - - if (INHERITED == levelStr) + + if (INHERITED == levelStr) { - if (isRoot) + if (isRoot) { LogLog.Error(declaringType, "Root level cannot be inherited. Ignoring directive."); - } - else + } + else { - LogLog.Debug(declaringType, "Logger [" + loggerName + "] level set to inherit from parent."); + LogLog.Debug(declaringType, "Logger [" + loggerName + "] level set to inherit from parent."); log.Level = null; } - } - else + } + else { log.Level = log.Hierarchy.LevelMap[levelStr]; if (log.Level == null) @@ -546,7 +546,7 @@ protected void ParseLevel(XmlElement element, Logger log, bool isRoot) } else { - LogLog.Debug(declaringType, "Logger [" + loggerName + "] level set to [name=\"" + log.Level.Name + "\",value=" + log.Level.Value + "]."); + LogLog.Debug(declaringType, "Logger [" + loggerName + "] level set to [name=\"" + log.Level.Name + "\",value=" + log.Level.Value + "]."); } } } @@ -567,7 +567,7 @@ protected void ParseLevel(XmlElement element, Logger log, bool isRoot) /// string argument and return a value that can be used to /// set the property. /// - protected void SetParameter(XmlElement element, object target) + protected void SetParameter(XmlElement element, object target) { // Get the property name string name = element.GetAttribute(NAME_ATTR); @@ -650,8 +650,8 @@ protected void SetParameter(XmlElement element, object target) } catch(System.Security.SecurityException) { - // This security exception will occur if the caller does not have - // unrestricted environment permission. If this occurs the expansion + // This security exception will occur if the caller does not have + // unrestricted environment permission. If this occurs the expansion // will be skipped with the following warning message. LogLog.Debug(declaringType, "Security exception while trying to expand environment variables. Error Ignored. No Expansion."); } @@ -707,7 +707,7 @@ protected void SetParameter(XmlElement element, object target) // to pass to this property. object convertedValue = ConvertStringTo(propertyType, propertyValue); - + // Check if we need to do an additional conversion if (convertedValue != null && parsedObjectConversionTargetType != null) { @@ -853,7 +853,7 @@ private bool HasAttributesOrElements(XmlElement element) } /// - /// Test if a is constructible with Activator.CreateInstance. + /// Test if a is constructible with LoggerManager.GetService. /// /// the type to inspect /// true if the type is creatable using a default constructor, false otherwise @@ -925,7 +925,7 @@ private MethodInfo FindMethodInfo(Type targetType, string name) /// The string value to use as the value of the object. /// /// - /// An object of type with value or + /// An object of type with value or /// null when the conversion could not be performed. /// /// @@ -966,7 +966,7 @@ protected object ConvertStringTo(Type type, string value) /// type. /// /// - protected object CreateObjectFromXml(XmlElement element, Type defaultTargetType, Type typeConstraint) + protected object CreateObjectFromXml(XmlElement element, Type defaultTargetType, Type typeConstraint) { Type objectType = null; @@ -1027,7 +1027,7 @@ protected object CreateObjectFromXml(XmlElement element, Type defaultTargetType, object createdObject = null; try { - createdObject = Activator.CreateInstance(objectType); + createdObject = LoggerManager.GetService(objectType); } catch(Exception createInstanceEx) { @@ -1037,7 +1037,7 @@ protected object CreateObjectFromXml(XmlElement element, Type defaultTargetType, // Set any params on object foreach (XmlNode currentNode in element.ChildNodes) { - if (currentNode.NodeType == XmlNodeType.Element) + if (currentNode.NodeType == XmlNodeType.Element) { SetParameter((XmlElement)currentNode, createdObject); } @@ -1104,7 +1104,7 @@ private IDictionary CreateCaseInsensitiveWrapper(IDictionary dict) private const string CONFIGURATION_TAG = "log4net"; private const string RENDERER_TAG = "renderer"; private const string APPENDER_TAG = "appender"; - private const string APPENDER_REF_TAG = "appender-ref"; + private const string APPENDER_REF_TAG = "appender-ref"; private const string PARAM_TAG = "param"; // TODO: Deprecate use of category tags @@ -1119,7 +1119,7 @@ private IDictionary CreateCaseInsensitiveWrapper(IDictionary dict) private const string ROOT_TAG = "root"; private const string LEVEL_TAG = "level"; private const string REF_ATTR = "ref"; - private const string ADDITIVITY_ATTR = "additivity"; + private const string ADDITIVITY_ATTR = "additivity"; private const string THRESHOLD_ATTR = "threshold"; private const string CONFIG_DEBUG_ATTR = "configDebug"; private const string INTERNAL_DEBUG_ATTR = "debug"; diff --git a/src/Util/OptionConverter.cs b/src/Util/OptionConverter.cs index cc791dc8..286097e1 100644 --- a/src/Util/OptionConverter.cs +++ b/src/Util/OptionConverter.cs @@ -493,7 +493,7 @@ public static object InstantiateByClassName(string className, Type superClass, o LogLog.Error(declaringType, "OptionConverter: A [" + className + "] object is not assignable to a [" + superClass.FullName + "] variable."); return defaultValue; } - return Activator.CreateInstance(classObj); + return LoggerManager.GetService(classObj); } catch (Exception e) { diff --git a/src/Util/PatternParser.cs b/src/Util/PatternParser.cs index bfe44526..648bd3d4 100644 --- a/src/Util/PatternParser.cs +++ b/src/Util/PatternParser.cs @@ -336,7 +336,7 @@ private void ProcessConverter(string converterName, string option, FormattingInf PatternConverter pc = null; try { - pc = (PatternConverter)Activator.CreateInstance(converterInfo.Type); + pc = (PatternConverter)LoggerManager.GetService(converterInfo.Type); } catch(Exception createInstanceEx) { diff --git a/src/Util/TypeConverters/ConverterRegistry.cs b/src/Util/TypeConverters/ConverterRegistry.cs index 0ddfb12f..12cffbbc 100644 --- a/src/Util/TypeConverters/ConverterRegistry.cs +++ b/src/Util/TypeConverters/ConverterRegistry.cs @@ -24,6 +24,7 @@ #endif using System.Reflection; using System.Collections; +using log4net.Core; namespace log4net.Util.TypeConverters { @@ -259,11 +260,11 @@ private static object CreateConverterInstance(Type converterType) try { // Create the type converter - return Activator.CreateInstance(converterType); + return LoggerManager.GetService(converterType); } catch(Exception ex) { - LogLog.Error(declaringType, "Cannot CreateConverterInstance of type ["+converterType.FullName+"], Exception in call to Activator.CreateInstance", ex); + LogLog.Error(declaringType, "Cannot CreateConverterInstance of type ["+converterType.FullName+"], Exception in call to LoggerManager.GetService", ex); } } else From 66acf3ef042f361ba26f991c21a4b63f87264f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BD=AD=E4=BC=9F?= Date: Mon, 13 Aug 2018 13:24:09 +0800 Subject: [PATCH 2/2] Add Test --- tests/src/Hierarchy/Hierarchy.cs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/src/Hierarchy/Hierarchy.cs b/tests/src/Hierarchy/Hierarchy.cs index 446090f6..9fe87cbf 100644 --- a/tests/src/Hierarchy/Hierarchy.cs +++ b/tests/src/Hierarchy/Hierarchy.cs @@ -22,6 +22,7 @@ using System; using System.Xml; using log4net.Config; +using log4net.Core; using log4net.Repository; using log4net.Tests.Appender; using NUnit.Framework; @@ -209,5 +210,32 @@ public void LoggerNameCanContainSequenceOfDots() ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); XmlConfigurator.Configure(rep, log4netConfig["log4net"]); } + + [Test] + public void GetServiceTest() + { + try + { + LoggerManager.GetService = null; + } + catch (Exception e) + { + Assert.IsInstanceOf(e); + } + + LoggerManager.GetService = type => + { + Assert.AreEqual(typeof(log4net.Repository.Hierarchy.Hierarchy), type); + + return Activator.CreateInstance(type); + }; + + XmlDocument log4netConfig = new XmlDocument(); + log4netConfig.LoadXml(@" + + "); + + ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); + } } }