两个记录器写入同一个文件

时间:2015-02-05 16:12:29

标签: logging log4net log4net-configuration

我配置了两个记录器并希望它们同时记录到事件日志和文本文件,但它们都记录到文本。 这是我的配置文件:

<log4net>
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
      <file value="NavRiskFileImportError.log" />
      <appendToFile value="true" />
      <maximumFileSize value="100KB" />
      <maxSizeRollBackups value="2" />
      <datePattern value="yyyyMMdd" />
      <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="{%level}{%date} – %message%newline"/>
        </layout>
    </appender>

    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
      <param name="ApplicationName" value="NavriskFromExcel" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
<!--loggers-->
    <logger name="FileLogger">
      <level value="ALL" />
      <appender-ref ref="RollingFile" />
    </logger>

    <logger name="EventLogger">
      <level value="ALL" />
      <appender-ref ref="EventLogAppender" />
    </logger>

    <root>
      <level value="DEBUG" />
      <appender-ref ref="EventLogAppender" />
      <appender-ref ref="RollingFile" />
    </root>
  </log4net>

在我的申请中,我有:

private static  ILog logger= LogManager.GetLogger("FileLogger");
private static  ILog eventLogger= LogManager.GetLogger("EventLogger");

但是两个记录器都在向文件写入数据而在事件日志中没有任何内容。我做错了什么?

1 个答案:

答案 0 :(得分:4)

您必须在各个记录器上指定additivity="false",否则它们会从根记录器继承appender:

  

默认情况下,Additivity设置为true,即子项继承   默认情况下他们祖先的追随者。如果此变量设置为   false然后在此记录器的祖先中找到的appender不是   使用过(source

这意味着:

<logger name="EventLogger" additivity="false">

这解释了为什么两者都写入文件。

所以剩下的问题是EventLogAppender无法正常工作的原因。您可以使用以下代码检查配置错误:

var messages = LogManager.GetRepository().ConfigurationMessages.Cast<LogLog>();

if (messages.Any())
{
     string message = messages.Aggregate("Log4net Configuration Errors: "
                                        + Environment.NewLine,
            (s, log) => s + log.Message + Environment.NewLine);
}

如果没有显示任何内容,enable log4net internal debugging并检查输出。

编辑:文档说明EventLogAppender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges,但事件源需要由提升的进程创建,或者installer - 每台计算机必须创建一次事件源。