2015-12-03 6 views
1

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

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> 

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

+0

http://stackoverflow.com/questions/2763740/log4j-log-output-of-a-specific-class-to-a-specific-appender –

+0

Это ссылки на решение log4j. Я не знаю, совпадает ли это с log4net. Кроме того, я ищу решение, которое создается через файл конфигурации. – Ray

ответ

4

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

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

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

// Log overtime - EmployeeOvertimeService 
ILog logger = LogManager.GetLogger(typeof(EmployeeOvertimeService)); 
+0

Отлично! Это сработало! – Ray

0

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

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