防止Log4Net写入所有日志文件

Ray*_*Ray 2 log4net log4net-configuration

我使用log4net进行了以下配置.问题是我的C#代码中的记录器现在将错误记录到两个日志文件中.我在同一个Windows服务中有两个不同的服务类.我使用以下行在一个服务中初始化记录器:

private static readonly ILog _logger = LogManager.GetLogger(typeof(EmployeeImportService));
Run Code Online (Sandbox Code Playgroud)

但是当这个服务运行并记录时,它会写入两个日志文件.

<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>
Run Code Online (Sandbox Code Playgroud)

如何配置它以便每个服务都写入自己的日志文件?我读到配置中的logger标签有一个additivity属性可以解决这个问题,但我的配置中没有logger元素.

stu*_*rtd 6

您可以拥有两个单独的记录器,并定义每个记录器将在配置中使用哪些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>
Run Code Online (Sandbox Code Playgroud)

然后在您的服务类中,您将获得适当的记录器:

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

// Log overtime - EmployeeOvertimeService
ILog logger = LogManager.GetLogger(typeof(EmployeeOvertimeService));
Run Code Online (Sandbox Code Playgroud)