防止Log4Net向所有日志文件中写入

3
我有以下使用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元素。


https://dev59.com/53E85IYBdhLWcg3wdDSz - Mr_Thorynque
这个链接指向log4j解决方案。我不知道它是否与log4net相同。此外,我正在寻找通过配置文件创建的解决方案。 - Ray
2个回答

8
您可以拥有两个独立的日志记录器,并在配置中定义每个记录器将使用哪些附加程序:您必须声明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));

0

哎呀,是的,我犯了一个错误。但它差不多一样。您必须在每个appender节点中创建过滤器。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接