log4net - настроить с использованием нескольких файлов конфигурации - PullRequest
26 голосов
/ 05 мая 2010

У меня есть приложение, состоящее из хоста и сменных модулей (плагинов).

Я хочу иметь возможность настроить log4net для хоста и для каждого из других модулей. Каждый из них должен иметь свой собственный файл конфигурации, и каждый из них будет регистрироваться в другом файле.

Только хост имеет файл App.config. Плагины имеют свой собственный файл конфигурации, содержащий разделы конфигурации log4net.

Вызов XmlConfigurator.Configure из одного из плагинов отменяет определения хоста app.config log4net.

Существует ли простой способ добавления конфигураций вместо их переопределения?

Спасибо, Gai.

Ответы [ 3 ]

16 голосов
/ 30 июня 2010

Похоже, вы уже нашли решение, которое работает для вас. Однако я нашел другое решение, которое я считаю «более идеальным», поэтому я опубликую его здесь для тех, кто может найти этот вопрос в будущем.

log4net имеет концепцию, называемую репозитории, которые можно настраивать отдельно. Это не очень популярно и не очень хорошо задокументировано, но вот некоторая документация, которую я нашел:

http://logging.apache.org/log4net/release/manual/repositories.html

В любом случае, все, что вам нужно сделать, это добавить RepositoryAttribute в сборку вашего плагина или сборки с именем хранилища, уникальным для этого плагина, и log4net будет отделять его от всего остального.

4 голосов
/ 23 июля 2010

Еще один способ состоит в том, чтобы иметь несколько файлов конфигурации log4net в нескольких местах, загрузить их все в XDocument для эффективного составления одного и затем вызвать XmlConfigurator.Configure () . Я сделал так, чтобы создать каждый файл после XSD для конфигурации, загрузить все дочерние элементы корневого узла log4net каждого файла в отдельные экземпляры XElement и объединить их в новый XDocument с корнем log4net. узел. Я обновлю этот ответ кодом (сейчас его нет у меня), если кому-то будет интересно.

Поиск файлов - это другое дело: используйте какое-то соглашение для сканирования файлов (например, *.dll.log4net.config), вставьте их в сборки или что-то в этом роде.

Реализация такого кода может быть найдена на:

www.kopf.com.br / kaplof / с использованием многодисковых конфигурационных файлов-с-log4net

2 голосов
/ 06 мая 2010

Я сам столкнулся с этой проблемой. Хотя это не совсем то, что я бы назвал «идеальным», я думаю, что лучшим решением в настоящее время является использование метода ConfigureAndWatch класса XmlConfigurator. По сути, ваша сборка хоста настраивает конфигурацию log4net, используя определенный файл конфигурации. Когда ваши плагины загружаются, попросите их записать свои элементы конфигурации в раздел конфигурации log4net в том же файле конфигурации. Поскольку log4net велено следить за изменениями в этом файле с помощью ConfigureAndWatch, когда в файл добавляются эти новые данные, log4net перезагрузит конфигурацию, которая теперь будет включать элементы конфигурации из подключаемых модулей.

Это немного глупо, но, похоже, работает. Следующий шаг, конечно же, будет перенесен в мою структуру ведения журналов, чтобы доступ к файлу конфигурации был федеративным.

Обратите внимание, что существует небольшая задержка между записью / сохранением конфигурации плагина и перезагрузкой обновленной конфигурации и ее применением в хранилище регистратора.

...