当前位置: 首页 > 知识库问答 >
问题:

log4net-修改各个记录器和追加器组合的日志记录级别

宣望
2023-03-14
<log4net>
  <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\Logs\" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="'Info.'yyyy-MM-dd'.log.txt'"/>
    <staticLogFileName value="false" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="INFO" />
    </filter>
  </appender>
  <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\Logs\" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="'Debug.'yyyy-MM-dd'.log.txt'"/>
    <staticLogFileName value="false" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <logger name="NHibernate" additivity="false">
    <appender-ref ref="InfoAppender">
      <threshold value="WARN" />
    </appender-ref>
    <appender-ref ref="DebugAppender">
      <threshold value="INFO" />
    </appender-ref>
  </logger>
  <root>
    <level value="DEBUG" />
    <appender-ref ref="InfoAppender" />
    <appender-ref ref="DebugAppender" />
  </root>
</log4net>
        XmlConfigurator.Configure();
        var logger1 = LogManager.GetLogger("Program");
        var logger2 = LogManager.GetLogger("NHibernate");
        logger1.Debug("Debug message");
        logger2.Debug("Debug message");
        logger1.Info("Info message");
        logger2.Info("Info message");
        logger1.Warn("Warn message");
        logger2.Warn("Warn message");

但是这两条调试消息都记录到DebugAppender,而这两条信息消息都记录到InfoAppender。

共有1个答案

方宏富
2023-03-14

log4net的配置机制相当宽松,但不会告诉您什么时候没有考虑某些参数。例如,在您的配置中,下面引用了appenderInfoAppender,但是threshold属性不做任何事情

 <appender-ref ref="InfoAppender">
    <threshold value="WARN" />
  </appender-ref>

appender-ref节点下面的xml元素不进行解析,您可以考虑任何它不会考虑的内容:

protected void ParseChildrenOfLoggerElement(XmlElement catElement, Logger log, bool isRoot)
// some code ommited
        if (xmlElement.LocalName == "appender-ref")
        {
            IAppender appender = this.FindAppenderByReference(xmlElement);
            string attribute = xmlElement.GetAttribute("ref");
            if (appender != null)
            {
                LogLog.Debug(string.Concat(new string[]
                {
                    "XmlHierarchyConfigurator: Adding appender named [",
                    attribute,
                    "] to logger [",
                    log.Name,
                    "]."
                }));
                log.AddAppender(appender);
            }
            else
            {
                LogLog.Error("XmlHierarchyConfigurator: Appender named [" + attribute + "] not found.");
            }
        }

您需要做的是在记录器和最终的追加器之间添加一个过滤器。为此,我建议使用ForwardingAppender,它允许您在添加某些行为的同时在追加器之间传递日志事件:将配置文件的NHibernate部分更改为:

<appender name="NHibernateDebugFilterAppender" type="log4net.Appender.ForwardingAppender">
  <appender-ref ref="DebugAppender"/>
  <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="INFO" />
  </filter>
</appender>

<appender name="NHibernateInfoFilterAppender" type="log4net.Appender.ForwardingAppender">
  <appender-ref ref="InfoAppender"/>
  <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="WARN" />
  </filter>
</appender>

<logger name="NHibernate" additivity="false">
  <appender-ref ref="NHibernateInfoFilterAppender" />
  <appender-ref ref="NHibernateDebugFilterAppender"/>
</logger>
 类似资料:
  • 现在,问题是,当我以以下方式进行日志记录时: 尽管根记录器级别被设置为“错误”,但日志条目仍然存在于两个日志文件中。然而,当我去掉“it.pkg.testpkg.service”记录器(通过注释或删除它)时,条目停止进入根记录器。我不太清楚这是怎么回事。 目前,我已经找到了一个临时解决方案,方法是在“root_file_appender”中添加以下条目: 谢了。

  • 我想做的很直截了当: 我只希望在控制台追加器上显示重要的消息,而我希望将详细的消息路由到文件追加器。 我还尝试向添加一个ThresholdFilter,但这也不能过滤它。

  • 我们有两个不同的ASP.NET应用程序启用了Log4net日志记录。它们都有相同的log4net1.2.10.0版本。

  • 我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?

  • 我正在尝试使用log4net将性能记录器分离到一个单独的日志中... 一旦我有了这个设置,我将错误记录到我的滚动日志文件中,然而我想捕获一些信息级别的数据到我的perf文件中... 我现在得到我的信息和警告在我的Perf日志,但我也得到我的错误在那里,它可能得到我的错误在我的主日志和我的信息级别在我的Perf日志?

  • 我使用的是播放框架,其中日志是默认的记录器引擎。为了便于跟踪,我希望将两个不同的活动(和)记录在两个单独的文件中。为此,我有两个追加器和两个记录器。每个记录器都用特定的appender标记。 我希望通过事务记录器(如登录或注册相关活动(如 但不管用。有什么想法吗? 我所说的“不工作”是指相同的日志被附加到两个记录器中,而不是特定于特定的日志。例如。如果我从播放代码调用,事务和登录记录器都将用户X已