2015-12-03 61 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> 

如何配置它以便每個服務都寫入它自己的日誌文件?我讀過配置中的記錄器標籤有一個可以解決這個問題的addability屬性,但是我的配置中沒有記錄器元素。

+0

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

+0

這鏈接指向log4j解決方案。我不知道它是否與log4net相同。除此之外,我正在尋找通過配置文件製作的解決方案。 – Ray

回答

4

您可以擁有兩個單獨的記錄器,並定義每個記錄器將在配置中使用哪些appender:您必須聲明additivity=false,否則記錄器會從根記錄器繼承appender。

所以,用虛構的名字:

<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是我做了一個錯誤。但它也一樣。你必須在每個附加目的地節點創建過濾器

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