Могут ли приложения log4net быть определены в их собственных файлах XML? - PullRequest
0 голосов
/ 12 мая 2010

Я хочу определить несколько (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);
}

1 Ответ

1 голос
/ 12 мая 2010

Я бы сделал следующее:

  • читать все фрагменты XML
  • объединить их самостоятельно (с помощью linq или чего-либо еще) в действительный файл конфигурации log4net (в памяти, конечно)
  • передать это в log4net
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...