Запретить Log4Net записывать во все файлы журналов

У меня есть следующая конфигурация с использованием log4net. Проблема в том, что средство ведения журнала в моем коде C # теперь регистрирует ошибки в двух файлах журнала. У меня есть два разных класса обслуживания в одной службе Windows. Я инициализирую регистратор в одном сервисе, используя эту строку:

private static readonly ILog _logger = LogManager.GetLogger(typeof(EmployeeImportService));

Но когда эта служба запускается и регистрируется, она записывается в оба файла журнала.

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <param name="File" value="C:\Temp\HRFiles\Sharp\Log\Log.txt" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" />
      </layout>
    </appender>
    <appender name="OvertimeLogFileAppender" type="log4net.Appender.FileAppender">
      <param name="File" value="C:\Temp\HRFiles\YTD\Log\Log.txt" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" />
      </layout>
    </appender>

    <root>
      <level value="ALL" />
      <appender-ref ref="LogFileAppender" />
      <appender-ref ref="OvertimeLogFileAppender" />
    </root>
</log4net>

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


person Ray    schedule 03.12.2015    source источник
comment
stackoverflow.com/questions/2763740/   -  person Mr_Thorynque    schedule 03.12.2015
comment
Эта ссылка указывает на решение log4j. Не знаю, то же самое, что log4net. Кроме того, я ищу решение, которое создается через файл конфигурации.   -  person Ray    schedule 03.12.2015


Ответы (2)


Вы можете иметь два отдельных регистратора и определять, какие дополнения каждый регистратор будет использовать в конфигурации: вам нужно объявить additivity=false, иначе регистраторы наследуют дополнения от корневого регистратора.

Итак, с выдуманными именами:

<root>
  <level value="ALL" />
  <appender-ref ref="LogFileAppender" />
  <appender-ref ref="OvertimeLogFileAppender" />
</root>

<logger name="Company.Project.EmployeeImportService" additivity="false">
    <appender-ref ref="LogFileAppender" />
</logger>

<logger name="Company.Project.EmployeeOvertimeService" additivity="false">
    <appender-ref ref="OvertimeLogFileAppender" />
</logger>

Тогда в ваших классах обслуживания вы получите соответствующий регистратор:

// General log - EmployeeImportService
ILog logger = LogManager.GetLogger(typeof(EmployeeImportService));

// Log overtime - EmployeeOvertimeService
ILog logger = LogManager.GetLogger(typeof(EmployeeOvertimeService));
person stuartd    schedule 03.12.2015

Упс, да, я ошибся. Но тихо то же самое. Вы должны создать фильтр в каждом узле приложения

<filter type="log4net.Filter.LoggerMatchFilter">
  <!-- allows this sub-namespace to be logged... -->
  <loggerToMatch value="EmployeeImportService" />
</filter>
person Mr_Thorynque    schedule 03.12.2015