Log4Net - 我可以在Config中拥有自定义部分名称

时间:2013-09-19 23:14:12

标签: log4net sitecore log4net-configuration

我需要在config部分使用除log4net之外的部分名称。我知道这是我们通常使用的

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />

但我需要这样的部分

<section name="log2net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />

我正在使用sitecore网站,它有自己的Sitecore.Logging dll,它也来自log4net。因此,Sitecore Logging dll指的是web.config中的log4net部分

我们的自定义log4net appender仅适用于log4net,而不适用于sitecore.logging dll。所以我想我的项目中可以有两个记录器,sitecore.logger和log4net记录器。 Sitecore.logger使用log4net部分,所以我希望log4net使用不同的部分,如log2net

我尝试在config中使用log2net部分来使用以下代码。

但我收到错误log4net:ERROR XmlHierarchyConfigurator:Xml元素是 - 不是log4net元素。

 XmlElement element = (XmlElement)ConfigurationManager.GetSection("log2net");
        log4net.Config.XmlConfigurator.Configure(element); 

任何人都可以帮忙。

1 个答案:

答案 0 :(得分:4)

我无法重现您遇到的异常,但查看其详细信息和code of XmlHierarchyConfigurator class时,如果根xml元素名称不是log4net,则会引发异常,这正是你想做什么。

您可以尝试做的是:

  1. 阅读您的自定义log2net XmlElement
  2. 制作新的log4net XmlElement
  3. log2net的所有孩子复制到新的log4net元素
  4. 执行传递新XmlConfigurator.Configure()元素的log4net方法。
  5. XmlElement element = (XmlElement)ConfigurationManager.GetSection("log2net");
    
    XmlElement newLog4net = element.OwnerDocument.CreateElement("log4net");
    
    for (int i = 0; i < element.ChildNodes.Count; i++)
    {
        XmlNode child = element.ChildNodes[i];
        newLog4net.AppendChild(child.CloneNode(true));
    }
    
    log4net.Config.XmlConfigurator.Configure(newLog4net);