【问题标题】:log4j directs all log output to stdout even though it's not supposed tolog4j 将所有日志输出定向到标准输出,即使它不应该这样做
【发布时间】:2009-08-07 10:59:24
【问题描述】:

在我的 log4j.properties 中有:

log4j.rootLogger=DEBUG,stdout

log4j.logger.notRootLogger=DEBUG,somewhereelse

appender stdout 和somethingelse 都配置正确,stdout 写入控制台,somewhereelse 写入文件。

在每个类的代码中,我都设置了一个:

static Logger log =  Logger.getLogger("notRootLogger);

^ 当我不想让东西进入控制台时。

-或-

static Logger log = Logger.getRootLogger();

^ 当我这样做时。

我必须在 log4.properties 中做什么才能阻止写入 notRootLogger 的内容最终出现在标准输出中?根记录器写入的位置是否存在某种继承,需要以某种方式关闭?

我不想为我只想记录到控制台的每个类单独配置一个记录器。

【问题讨论】:

    标签: java log4j


    【解决方案1】:

    您需要设置additivity = false,IIRC。来自log4j manual

    每个启用的日志记录请求 给定的记录器将被转发给所有 该记录器中的附加程序也是如此 作为更高的附加器 等级制度。换句话说,附加程序 是从加法继承而来的 记录器层次结构。例如,如果一个 控制台附加程序被添加到根 记录器,然后所有启用的记录 请求至少会打印在 安慰。如果另外一个文件 appender 被添加到记录器中,比如 C, 然后启用 C 的日志记录请求 和 C 的孩子将打印在一个文件上 并在控制台上。有可能 覆盖此默认行为,以便 appender 积累不再 通过设置加性进行加法 标记为假。

    试试这个:

    log4j.rootLogger=DEBUG,stdout
    log4j.logger.notRootLogger=DEBUG,somewhereelse
    log4j.additivity.notRootLogger=false
    

    【讨论】:

      【解决方案2】:

      嗯,应该更仔细地阅读 log4j 的简短介绍

      log4j.additivity.notRootLogger=false
      

      修复它,因为它从层次结构中它上面的记录器继承附加程序,而根记录器显然位于层次结构的顶部。

      【讨论】:

      • 这和优化有什么关系?
      • 以什么方式“过早优化”?这根本不是“优化”。碰巧你想要一个与默认值不同的选项。如果默认情况下可加性为假,则意味着很多其他人必须明确将其设置为真。我怀疑更多的人想要它“真”而不是“假”。
      • 如果您阅读过或使用过 log4j 介绍文档,那么期望非常明确
      【解决方案3】:

      如果java类中已经定义了logger的属性,可以在最后调用logger.shutdown()方法,最好在finally块中禁止logger的附加性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-31
        • 2010-10-14
        • 2018-01-09
        • 1970-01-01
        • 2016-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多