Подтвердить что ты не робот

Log4net - настройка с использованием нескольких файлов конфигурации

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

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

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

Вызов XmlConfigurator. Конфигурация из одного из плагинов переопределяет определения хоста app.config хоста.

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

Спасибо, Gai.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

www.kopf.com.br/kaplof/using-multiple-configuration-files-with-log4net