3

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.

Ray
  • 4,679
  • 10
  • 46
  • 92
  • http://stackoverflow.com/questions/2763740/log4j-log-output-of-a-specific-class-to-a-specific-appender – Mr_Thorynque Dec 03 '15 at 14:47
  • This link points to log4j solution. I don't know if it's the same as log4net. Besides I'm looking for a solution that is made via the configuration file. – Ray Dec 03 '15 at 14:55

2 Answers2

8

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));
stuartd
  • 70,509
  • 14
  • 132
  • 163
0

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>
Mr_Thorynque
  • 1,749
  • 1
  • 20
  • 31