我想在我的库中定义一些(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);
}
答案 0 :(得分:1)
我会做以下事情: