防止 Log4Net 写入所有日志文件
Prevent Log4Net from writing to all log files
我使用 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>
如何配置它以便每个服务写入它自己的日志文件?我读到配置中的 logger 标签有一个 additivity 属性可以解决这个问题,但我的配置中没有 logger 元素。
您可以有两个独立的记录器,并定义每个记录器将在配置中使用哪些附加程序:您必须声明 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));
哎呀,是的,我做错了。但它同样安静。您必须在每个附加程序节点中创建过滤器
<filter type="log4net.Filter.LoggerMatchFilter">
<!-- allows this sub-namespace to be logged... -->
<loggerToMatch value="EmployeeImportService" />
</filter>
我使用 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>
如何配置它以便每个服务写入它自己的日志文件?我读到配置中的 logger 标签有一个 additivity 属性可以解决这个问题,但我的配置中没有 logger 元素。
您可以有两个独立的记录器,并定义每个记录器将在配置中使用哪些附加程序:您必须声明 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));
哎呀,是的,我做错了。但它同样安静。您必须在每个附加程序节点中创建过滤器
<filter type="log4net.Filter.LoggerMatchFilter">
<!-- allows this sub-namespace to be logged... -->
<loggerToMatch value="EmployeeImportService" />
</filter>