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

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

  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 и передал ему уникальное имя, а это частная переменная-член, как возможно, что он начинает писать не в тот файл?


person Dave    schedule 11.12.2012    source источник


Ответы (1)


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

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

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

person Dave    schedule 11.12.2012