Проблемы с записью данных из нескольких экземпляров в отдельные файлы журнала

В моем обычном опыте регистрации я просто создаю 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". Кажется, все работает отлично, пока я не начну вызывать методы в каждом объекте. Когда я чередую вызовы, данные для одного объекта сначала записываются в файл другого объекта, но затем данные записываются в правильный файл. Например, вот упрощенный пример того, что происходит:

  1. test1.log () -> пишет в test1.log
  2. test2.log () -> пишет в test2.log
  3. test1.log () -> записывает строку в test2.log, а остальное записывается в test1.log
  4. test2.log () -> записывает lint в test1.log, а остальное записывается в test2.log

Если я запускаю два метода параллельно, все строки записываются в один или другой файл. Тогда что действительно странно, так это то, что другой, наиболее часто используемый файл больше никогда не записывается!

Я не уверен, где искать дальше. Если я создал экземпляр Logger через GetLogger и передал ему уникальное имя, а это личная переменная-член, как это возможно, что он начинает писать в неправильный файл?

1 ответ

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

РЕДАКТИРОВАТЬ - ну, это было не так. Я заменил свойство в logging.xml на <File value="TEMP" /> а затем в коде позади, я загрузил FileAppender и установить его File свойство на правильный путь. Поведение идентично.:(

РЕДАКТИРОВАТЬ - Решение состоит в том, чтобы создать FileAppender за экземпляр, а не Logger за экземпляр. Я не уверен, почему мне потребовалось так много времени, чтобы прийти к такому выводу, но в конце концов я это сделал, и теперь, похоже, это работает.

Другие вопросы по тегам