Using log4net to write to different loggers
Asked Answered
P

2

20

I am using log4net to do my logging. I would like it to write to a file and to the eventlog at the same time.

For some reason, I find the messages twice in my logfile.

This is my app.config-section :

<log4net>
    <root>
        <level value="INFO" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="EventLogAppender" />
    </root>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
        <param name="File" value="c:\temp\DIS-logfile.txt" />
        <param name="AppendToFile" value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="10MB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%date %-5level %logger - %message%newline" />
        </layout>
    </appender>
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
        <param name="Indigo.DataIntakeService" value="eventlog" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date %-5level %logger - %message%newline" />
            </layout>
    </appender>
</log4net>

In my code I have tof following :

private static readonly ILog Log = log4net.LogManager.GetLogger("DataIntakeService");
private static readonly ILog LogEvents = log4net.LogManager.GetLogger("EventLogAppender");

static void Main(string[] args)
{
    log4net.Config.XmlConfigurator.Configure();
}

public static void LogInfo(string message)
{
    Log.Info(message);
    LogEvents.Info(message);
}

It writes to my log-file, as requested, but the messages should also go to my eventviewer and that doesn't happen. It writes those messages to the logfile as well.

Where did I go wrong?

Parasympathetic answered 14/6, 2013 at 10:37 Comment(0)
C
39

You have configured Log4Net so that the root logger logs to both file and event log appenders. All loggers inherit this configuration, so both your loggers "DataIntakeService" and "EventLogAppender" log to these appenders.

If you don't see log messages in event viewer, it may be because your application doesn't have permission to create the Event source.

UPDATE

How can i configure it so the DataIntakeService logs to the file and the other one to the eventviewer ?

Here's a sample configuration:

<log4net>
  <root>
    <level value="INFO" />
    <appender-ref ref="LogFileAppender" />
  </root>
  <logger name="EventLogAppender" additivity="False">
    <level value="INFO" />
    <appender-ref ref="EventLogAppender" />
  </logger>
  <appender>
  ... 

With this sample:

  • The root logger (and hence all child loggers unless explicitly configured otherwise) will log to LogFileAppender. Your DataIntakeService logger isn't explicitly configured, so inherits this configuration.

  • The EventLogAppender logger is explicitly configured to log to EventLogAppender, and is configured not to inherit settings from parent loggers (additivity="false"). Therefore it doesn't log to LogFileAppender. If you set additivity="true" it will inherit settings and log to both LogFileAppender and EventLogAppender.

Incidentally, naming a logger EventLogAppender is perhaps a bit confusing: EventLogLogger might be a better name.

Challis answered 14/6, 2013 at 10:44 Comment(3)
How can i configure it so the DataIntakeService logs to the file and the other one to the eventviewer ?Parasympathetic
This is a good explanation thanks. Just to clarify, if additivity is not specified then the default is True, correct?Flanagan
@Ben, yes, addivity defaults to true: logging.apache.org/log4net/release/sdk/…Challis
H
12

You can use log4net to write to different loggers by the configuration below.

<log4net>
<logger name="LogFileLogger">
  <level value="INFO" />
  <appender-ref ref="LogFileAppender" />
</logger>
<logger name="EventLogger">
  <level value="INFO" />
  <appender-ref ref="EventLogAppender" />
</logger>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
  ...
</appender>
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
  ...
</appender>

And you can call the loggers as:

private static readonly log4net.ILog LogFileLogger= log4net.LogManager.GetLogger("LogFileLogger");
private static readonly log4net.ILog EventLogger= log4net.LogManager.GetLogger("EventLogger");
Heidelberg answered 28/3, 2017 at 16:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.