【问题标题】:C# Log4Net Writing To Both AppendersC# Log4Net 写入两个 Appender
【发布时间】:2016-05-13 14:27:59
【问题描述】:

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

在我的程序的入口点构造函数中,我调用 log4net.Config.XmlConfigurator.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()

调用了正确的附加程序

这对我们来说过去工作得很好(使用多个附加程序写入不同的文件),但从那时起我们已经做了很多改变,我们尝试恢复但没有成功。没有错误,没有警告,也没有关于编译的消息。提前感谢您所做的一切! :)

【问题讨论】:

    标签: c# log4net rollingfileappender


    【解决方案1】:

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

    试试下面的配置,我想它会给你你想要的:

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

    【讨论】:

    • 谢谢你,乔!这对我们有用!我非常感谢你的帮助。我还将深入研究 Apache 在 Log4Net 上的文档以获得更好的理解。我收到了一些关于我的 app.config 的警告。 “警告元素'root'的内容不完整。预期的可能元素列表:'appender-ref'。”和“警告元素 'log4net' 的子元素 'logger' 无效。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2014-05-13
    • 2018-12-20
    相关资源
    最近更新 更多