Ray
Ray

Reputation: 4947

Prevent Log4Net from writing to all log files

I've got the following configuration using log4net. The problem is that the logger in my C# code is now logging the errors into the two log files. I've got two different service classes in the same windows service. I initialize the logger in one service using this line:

private static readonly ILog _logger = LogManager.GetLogger(typeof(EmployeeImportService));

But when this service runs and logs, it's writing to both log files.

<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>

How do I configure it so that each service writes to it's own log file? I read that the logger tag in the configuration has an additivity attribute that solves this problem but I have no logger element in my configuration.

Upvotes: 3

Views: 2078

Answers (2)

stuartd
stuartd

Reputation: 73303

You can have two separate loggers, and define which appenders each logger will use in the configuration: you do have to declare additivity=false or else the loggers inherit the appenders from the root logger.

So, with made-up names:

<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>

Then in your service classes you get the approppriate logger:

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

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

Upvotes: 8

Mr_Thorynque
Mr_Thorynque

Reputation: 2012

Oups yes I did a mistake. But it quiet the same. You have to create filter in each appender node

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

Upvotes: 0

Related Questions