Проблемы с записью данных из нескольких экземпляров в отдельные файлы журнала
В моем обычном опыте регистрации я просто создаю ILog
экземпляр в каждом классе, используя что-то вроде mylog = LogManager.GetLogger( name)
, который дает мне уникальный регистратор для каждого экземпляра. Все записывается в один файл и прекрасно работает.
Однако теперь у меня возникла ситуация, когда я хочу войти в два отдельных файла. Я делаю это с помощью следующего logging.xml:
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO"/>
<param name="LevelMax" value="FATAL"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<!-- Pattern to output the caller's file name and line number -->
<conversionPattern value="%date{yyyy-MM-dd-HH_mm_ss.fff} [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="File" type="log4net.Appender.FileAppender">
<file type="log4net.Util.PatternString" value="%property{LogName}" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{yyyy-MM-dd-HH_mm_ss.fff} [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="Console" />
<appender-ref ref="File" />
</root>
</log4net>
и в коде позади я установил имя FileAppender
для каждого экземпляра, присвоив ему уникальное имя:
log4net.GlobalContext.Properties["LogName"] = unique_path_here;
Если я создаю экземпляр одного объекта с именем "test1", создается файл "test1.log". Когда я создаю экземпляр другого объекта с именем "test2", создается файл "test2.log". Кажется, все работает отлично, пока я не начну вызывать методы в каждом объекте. Когда я чередую вызовы, данные для одного объекта сначала записываются в файл другого объекта, но затем данные записываются в правильный файл. Например, вот упрощенный пример того, что происходит:
- test1.log () -> пишет в test1.log
- test2.log () -> пишет в test2.log
- test1.log () -> записывает строку в test2.log, а остальное записывается в test1.log
- test2.log () -> записывает lint в test1.log, а остальное записывается в test2.log
Если я запускаю два метода параллельно, все строки записываются в один или другой файл. Тогда что действительно странно, так это то, что другой, наиболее часто используемый файл больше никогда не записывается!
Я не уверен, где искать дальше. Если я создал экземпляр Logger через GetLogger и передал ему уникальное имя, а это личная переменная-член, как это возможно, что он начинает писать в неправильный файл?
1 ответ
Конечно, теперь кажется очевидным, что "GlobalContext" подозрительно относится к имени класса.:) Я посмотрю на это, чтобы увидеть, заключается ли проблема в том, что свойство является общим для всех экземпляров Logger, и если да, то есть ли другой способ установить имя журнала для конкретного экземпляра журнала.
РЕДАКТИРОВАТЬ - ну, это было не так. Я заменил свойство в logging.xml на <File value="TEMP" />
а затем в коде позади, я загрузил FileAppender
и установить его File
свойство на правильный путь. Поведение идентично.:(
РЕДАКТИРОВАТЬ - Решение состоит в том, чтобы создать FileAppender
за экземпляр, а не Logger
за экземпляр. Я не уверен, почему мне потребовалось так много времени, чтобы прийти к такому выводу, но в конце концов я это сделал, и теперь, похоже, это работает.