可以在自己的XML文件中定义log4net appender吗?

时间:2010-05-12 13:31:10

标签: log4net

我想在我的库中定义一些(ADO.NET)appender,但允许我的库用户配置这些appender的使用。这样的事情似乎就是我想要的:

XmlConfigurator.Configure(appenderStream1);
XmlConfigurator.Configure(appenderStream2);
XmlConfigurator.Configure();

但是这似乎不起作用,尽管调试输出包含这样的消息:

  

配置更新模式[合并]。

这样做的正确方法是什么?或者,有没有其他方法可以要求用户复制大量的XML配置?

解决方案:
感谢Stephan的建议,我能够实现以下日志初始化方法。它首先将.config部分读入XmlDocument,然后将外部appender(在我的情况下是嵌入式资源)添加到文档中,最后将整个数据提供给log4net。

static readonly string[] AppenderConfigs =
{
    "Logging.EntryPointAppender.xml",
    "Logging.TracingAppender.xml",
    "Logging.MessagesAppender.xml",
};

public static void Initialize()
{
    // this first bit reads the log4net config in the application's config file
    var section = (XmlElement)ConfigurationManager.GetSection("log4net");
    if (section == null)
        return;
    XmlDocument xml = new XmlDocument();
    using (var xml_reader = new XmlNodeReader(section))
        xml.Load(xml_reader);

    // then we augment the above XML with the content of our embedded resources
    foreach (var appender_config in AppenderConfigs)
        using (var stream = EmbeddedResource.Open("My.Assembly", appender_config))
            AddToConfig(xml, stream);
    XmlConfigurator.Configure(xml.DocumentElement);
}

static void AddToConfig(XmlDocument config, Stream xmlStream)
{
    var fragment = config.CreateDocumentFragment();
    using (var reader = new StreamReader(xmlStream))
        fragment.InnerXml = reader.ReadToEnd();
    config.LastChild.AppendChild(fragment);
}

1 个答案:

答案 0 :(得分:1)

我会做以下事情:

  • 阅读所有xml片段
  • 自己(使用linq或其他)将它们组合到有效的log4net配置“文件”(当然在内存中)
  • 将其提供给log4net