В моем обычном опыте ведения журналов я просто создаю экземпляр ILog
в каждом классе, используя что-то вроде mylog = LogManager.GetLogger( name)
, что дает мне уникальный Logger для каждого экземпляра. Все записывается в один и тот же файл и прекрасно работает.
Однако теперь у меня возникла ситуация, когда я хочу войти в два отдельных файла. Я выполняю это с помощью следующего 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 и передал ему уникальное имя, а это частная переменная-член, как возможно, что он начинает писать не в тот файл?