【问题标题】:Two loggers writing to same file两个记录器写入同一个文件
【发布时间】:2015-02-05 16:12:29
【问题描述】:

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

<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");

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

【问题讨论】:

    标签: logging log4net log4net-configuration


    【解决方案1】:

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

    Additivity 默认设置为 true,即子代继承 默认情况下,它们的祖先的附加程序。如果此变量设置为 false 那么在这个记录器的祖先中找到的附加程序不是 使用过 (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 - 每台机器必须创建一次事件源。

    【讨论】:

    • 谢谢,试过了,现在它只写入文件,事件日志中没有任何内容,也没有错误
    • 我猜是权限。这是一个网络应用程序吗?
    • 不,这是控制台,在域管理员帐户下运行
    • 尝试以管理员身份运行它,以防它试图创建事件源 - 我没有使用 log4net 登录到事件日志,但我在其他情况下看到过。跨度>
    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多