Fairlight Evony
Fairlight Evony

Reputation: 243

C# Log4Net Writing To Both Appenders

I am using C# to write an in house application and we've been trying to figure out a resolution to this issue for a couple of days now. We're using Log4Net v1.2.15.0 compiling against .Net v4.5.2. I have two rolling file appenders, EventsLogger and SitrepLogger which are both set to write to the network. I have confirmed that this does work as intended however when I call one appender (doesn't matter which) to write out, it writes to both EventsLogger and SitrepLogger files. Here is the relevant data from my app.config

     <log4net>
    <appender name="EventsLogger" type="log4net.Appender.RollingFileAppender">
      <file name="File" value="\\TS-WXLF41\Project\Ambushed\${USERNAME}\EventsLog" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="1MB" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <param name="StaticLogFileName" value="false"/>
      <param name="RollingStyle" value="Date"/>
      <param name="DatePattern" value="_MM-dd-yy.\tx\t" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%newline%newline%date{HH:mm:ss tt} %message" />
      </layout>
    </appender>

    <appender name="SitrepLogger" type="log4net.Appender.RollingFileAppender">
      <file name="File" value="\\TS-WXLF41\Project\Ambushed\${USERNAME}\logs\sitrep" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="1MB" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <param name="StaticLogFileName" value="false"/>
      <param name="RollingStyle" value="Date"/>
      <param name="DatePattern" value="_MM-dd-yy.\tx\t"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%newline%newline%date{HH:mm:ss tt} %message" />
      </layout>
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="EventsLogger" />
      <appender-ref ref="SitrepLogger" />
    </root>
  </log4net>

In my Program's entry point constructor I call log4net.Config.XmlConfigurator.Configure(); which I am pretty sure is working as intended. I do not call Configure anywhere else in the code except from there. In the members are of my entry point class I call private static readonly log4net.ILog logger = log4net.LogManager.GetLogger("SitrepLogger"); to fetch the logger that I need for my Program (entry point) class. In my other classes I use the EventsLogger so I call private static readonly log4net.ILog eventslogger = log4net.LogManager.GetLogger("EventsLogger"); in the members are of those classes. I do not call GetLogger more than once per class and I am sure I invoking the correct appender by calling eventslogger.Info()

This used to work fine (using multiple appenders to write to different files) for us but we've made many many changes since then, which we have tried reverting to with no success. No errors, no warnings and no messages on compilation. Thank you for everything in advance! :)

Upvotes: 0

Views: 622

Answers (1)

to StackOverflow
to StackOverflow

Reputation: 124696

You are confusing appenders and loggers. Your application is creating loggers "SitrepLogger" and "EventsLogger". These both inherit the configuration of the root logger, and write to appenders with the same names "SitrepLogger" and "EventsLogger".

Try the following configuration, which I think will give you what you want:

 <log4net>
<appender name="EventsAppender" ... >
   ...
</appender>
<appender name="SitrepAppender" ... >
   ...
</appender>

<root>
  <level value="ALL" />
</root>
<logger name="EventsLogger" additivity="False">
  <appender-ref ref="EventsAppender" />
</logger>
<logger name="SitrepLogger" additivity="False">
  <appender-ref ref="SitrepAppender" />
</logger>
</log4net>

Upvotes: 1

Related Questions