Я хочу определить несколько (ADO.NET) приложений в моей библиотеке, но разрешить пользователям моей библиотеки настраивать использование этих приложений. Нечто подобное похоже на то, что я хочу:
XmlConfigurator.Configure(appenderStream1);
XmlConfigurator.Configure(appenderStream2);
XmlConfigurator.Configure();
Но, похоже, это не работает, несмотря на выходные данные отладки, содержащие такие сообщения:
Режим обновления конфигурации [Слияние].
Как правильно это сделать? Или есть ли альтернатива тому, чтобы просить пользователей дублировать большие фрагменты конфигурации XML?
Решение:
Благодаря предложению Стефана я смог реализовать следующий метод инициализации журнала. Сначала он читает секцию .config в XmlDocument
, а затем добавляет внешние документы (которые в моем случае являются встроенными ресурсами) в документ, и, наконец, передает весь лот в 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);
}