2
votes

I have a console application, where I'm trying to log to Windows Event Log with log4net using EventLogAppender. I also have two RollingFileAppenders, but those are working properly.

The RollingFileAppenders are in the root logger, configured like this:

<root>
  <level value="DEBUG" />
  <appender-ref ref="RollingFileAppenderInfo" />      
  <appender-ref ref="RollingFileAppenderDebug" />
</root>

The EventLogAppenders are in a logger called EventLogger, configured like this:

<logger Name="EventLogger">
  <level value="INFO" />
  <appender-ref ref="EventLogAppenderInfo"/>
  <appender-ref ref="EventLogAppenderError"/> 
</logger>

This way the EventLogger inherits the appenders from root. If I log something with EventLogger, it will be written to the log files as well. The reason why I've done it like this, because I don't want to spam the Windows Event Log with all the info entries, just the important ones. But I also want to log every error.

This is how I get the logger:

private static readonly log4net.ILog eventLog = log4net.LogManager.GetLogger("EventLogger");

The problem

Configured like this, using the eventlog object to log something in any level, log4net doesn't write to the Windows Event Log, but it writes to the log files, so the appenders in root are working.

If I put the EventLogAppenders to the root, they are working, but they are also logging INFO level entries that I don't want to log to the Event Log.

I don't think this would be a permission issue, the source is already created, and accessible.

Here are the two EventLogAppenders, if anyone's curious:

<appender name="EventLogAppenderInfo" type="log4net.Appender.EventLogAppender">
  <applicationName value="ApplicationName" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{yyyy.MM.dd HH:mm:ss} [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  </layout>
  <filter type="log4net.Filter.LevelMatchFilter">
    <levelToMatch value="INFO"/>
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
</appender>

<appender name="EventLogAppenderError" type="log4net.Appender.EventLogAppender">
  <applicationName value="ApplicationName" />
  <layout type="log4net.Layout.PatternLayout">
    <IgnoresException value="False"/>
    <conversionPattern value="%date{yyyy.MM.dd HH:mm:ss} [%thread] %-5level %logger [%property{NDC}] - %message%newline%exception" />
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="WARN" />
    <levelMax value="FATAL" />
  </filter>
</appender>

I can't think of anything why log4net doing this, if anyone has a solution, it would be much appreciated!

Cheers!

1

1 Answers

2
votes

I think this is a case-sensitive issue.

<logger Name="EventLogger">

should be

<logger name="EventLogger">