C#Log4Net写入两个Appender

时间:2016-05-13 14:27:59

标签: c# log4net rollingfileappender

我正在使用C#编写内部应用程序,我们已经尝试在几天内找到解决此问题的方法。我们正在使用针对.Net v4.5.2的Log4Net v1.2.15.0进行编译。我有两个滚动文件追加器,EventsLogger和SitrepLogger都设置为写入网络。我已经确认这确实按预期工作,但是当我调用一个appender(并不重要)时,它会写入EventsLogger和SitrepLogger文件。以下是我的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>

在我的Program的入口点构造函数中,我调用了log4net.Config.XmlConfigurator.Configure();我非常确定按预期工作。除了那里,我不会在代码中的任何其他位置调用Configure。在我的入口点类的成员中,我调用private static readonly log4net.ILog logger = log4net.LogManager.GetLogger("SitrepLogger");来获取我的程序(入口点)类所需的记录器。在我的其他类中,我使用EventsLogger,所以我在这些类的成员中调用private static readonly log4net.ILog eventslogger = log4net.LogManager.GetLogger("EventsLogger");。我不会每个课程多次调用GetLogger,我确信通过调用eventslogger.Info()

来调用正确的appender

这对我们来说工作得很好(使用多个appender写入不同的文件),但是从那时起我们已经做了很多改动,我们已经尝试恢复但没有成功。编译时没有错误,没有警告和消息。提前谢谢你的一切! :)

1 个答案:

答案 0 :(得分:1)

你混淆了appender和loggers。您的应用程序正在创建记录器“SitrepLogger”和“EventsLogger”。这些都继承了根记录器的配置,并写入具有相同名称“SitrepLogger”和“EventsLogger”的appender。

尝试以下配置,我认为它会为您提供所需的配置:

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