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

在log4net中为一个类更改日志级别,而不添加追加器

乜明朗
2023-03-14

我的应用程序登录到控制台和文件(log4net 1.2.11):

<root>
  <level value="DEBUG" />
  <appender-ref ref="ConsoleAppender" />
  <appender-ref ref="RollingLogFileAppender" />
</root>
<logger name="MyClass" additivity="false">
  <appender-ref ref="ConsoleAppender">
    <threshold value="INFO" />
  </appender-ref>
  <appender-ref ref="RollingLogFileAppender" />
</logger>
<logger name="MyClass">
  <level value="INFO" />
</logger>

共有1个答案

曹乐意
2023-03-14

您运气不好,当log4net解析appender-ref标记时,它不会向通过名称引用的appender传递任何信息(代码来自1.2.10):

// log4net.Repository.Hierarchy.XmlHierarchyConfigurator
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.");
    }
}

我很确定你链接的答案不是真的有效;Treshold属性存在于appender上,但不在ref节点中对其进行解析。

哪一个是最好的--如果记录器可以从其引用中更改一些appender属性,你能想象配置噩梦吗?最后一个被解析的记录器将赢得配置,并幸运地跟踪为什么调试追加器现在保持沉默,因为其他记录器交换了treshold值:)

所以您必须添加另一个追加器;如果您不想复制粘贴RollingLogFileAppender配置,您可以使用转发appender,在将消息传递到它自己引用的appender之前,它可以用作筛选器。你最终会

  • 根日志->ConsoleAppender
  • 根日志->rollingFileAppender
  • MyClass->ForwardingAppender with filter->ConsoleAppender
  • MyClass->RollingFileAppender
 类似资料:
  • 但是这两条调试消息都记录到DebugAppender,而这两条信息消息都记录到InfoAppender。

  • 我希望文件记录器以这样的方式配置日志类别'X' 记录器one在信息级别上记录“X”,在调试级别上记录其他东西 记录器在调试级别上有两个日志“x”

  • 我很难理解可加性、类别日志级别和追加器阈值之间的关系。 下面的场景(我的log4j.properties文件): null

  • 以下是我的java logback配置: 我想在这里做的是:我有两个日志追加器:一个用于控制台,另一个用于日志文件;但是对于相同的java软件包(例如:组织.apache.zookeeper),我想使用两个不同的日志级别,INFO用于文件追加器和错误用于康多尔;但是我的日志配置优势无法正常工作。任何人都可以找出我的错误或一些解决方案吗?

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

  • 我的团队使用来控制我们的, 在中,我们可以选择更改中的级别, 我们为每个(线程)有一个单独的记录器,如果我们想只看到一个线程的控制台日志,我们关闭所有其他线程记录器,问题是每个记录器都为和某个文件发送输出,我们只想关闭stdout输出。 log4j2.xml配置示例: 我们尝试了很多解决方案: 将父记录器与可加性结合使用,并将每个附加器分离到不同的记录器,对此有什么想法吗?