Чтобы развернуть ответ runeh:
>>> def foo(a):
... x = 2
... return x + a
>>> import inspect
>>> inspect.getsource(foo)
u'def foo(a):\n x = 2\n return x + a\n'
print inspect.getsource(foo)
def foo(a):
x = 2
return x + a
EDIT: Как указано в @ 0sh, этот пример работает с использованием ipython
, но не является простым python
. В обоих случаях должно быть хорошо, при импорте кода из исходных файлов.
Я просто сам столкнулся с этой проблемой. Хотя это не совсем то, что я бы назвал «идеальным», я думаю, что лучшим решением в настоящее время является использование метода ConfigureAndWatch
класса XmlConfigurator
. По сути, сборка узла настраивает конфигурацию log4net с помощью определенного файла конфигурации. Когда ваши плагины загружаются, заставьте их записать свои конфигурационные элементы в раздел конфигурации log4net в том же файле конфигурации. Поскольку log4net было сказано следить за изменениями в этом файле с помощью ConfigureAndWatch
, когда в файл добавлены эти новые данные, log4net перезагрузит конфигурацию, которая теперь будет включать элементы конфигурации из плагинов.
Это немного странно, но, похоже, это работает. Следующим шагом, конечно, будет перемещение этого в мою платформу ведения журналов, чтобы доступ к файлу конфигурации был федеративным.
Обратите внимание, что существует небольшая задержка между записью / сохранением конфигурации плагина и перезагрузкой обновленной конфигурации и применением к репозиторию регистратора.
Похоже, вы уже нашли решение, которое работает для вас. Однако я нашел другое решение, которое я считаю «более идеальным», поэтому я опубликую его здесь для тех, кто может найти этот вопрос в будущем.
У log4net есть концепция, называемая репозиториями, которую можно настраивать отдельно. Он не очень популярен и не очень хорошо документирован, но вот некоторую документацию, которую я нашел:
http://logging.apache.org/log4net/release/manual/repositories.html
В любом случае, все, что вам нужно сделать, это добавить RepositoryAttribute
в сборку вашего плагина или сборки с именем репозитория, уникальным для этого плагина, и log4net будет отделять его от всего остального.
Еще один способ - иметь несколько файлов конфигурации log4net в нескольких местах, загрузить их все в XDocument
, чтобы эффективно составить один, а затем вызвать XmlConfigurator.Configure () . Я сделал это таким образом, чтобы создать каждый файл, следуя XSD для конфигурации, загрузить все дочерние элементы корневого узла каждого файла log4net
в отдельные экземпляры XElement
и объединить их в новый XDocument
с корневым узлом log4net
. Я дополню этот ответ кодом (его сейчас нет передо мной), если кому-то будет интересно.
Найти файлы - это другое дело: используйте какое-то соглашение для сканирования файлов (например, *. Dll.log4net.config
), вставьте их в сборки или что-то в этом роде.
Реализацию такого кода можно найти на:
www.kopf.com.br/kaplof/using-multiple-configuration-files-with-log4net