【问题标题】:In a java.util.logging logging.properties file, what's the difference between "handlers" and ".handlers"?在 java.util.logging logging.properties 文件中,“handlers”和“.handlers”有什么区别?
【发布时间】:2016-08-12 02:33:26
【问题描述】:

在LogManager的文档中,Handlers属性的设置如下:

属性“处理程序”。这定义了一个空格或逗号分隔 要加载和注册为的处理程序类的类名列表 根 Logger 上的处理程序(名为“”的 Logger)。

属性“.handlers”。这定义了一个空格或逗号 要加载的处理程序类的单独的类名列表和 注册为指定记录器的处理程序。每个类名必须是 对于具有默认构造函数的 Handler 类。请注意,这些 处理程序可能会在第一次使用时延迟创建。

由于根记录器的名称是空字符串 (""),在我看来,下面的两个子句应该是等效的:

handlers = myHandler
.handlers = myHandler

这是 JDK 的 lib/logging.properties 文件中的一个示例:

handlers= java.util.logging.ConsoleHandler
.level= INFO

我注意到当我尝试枚举根记录器上的处理程序时发生了奇怪的事情。我怀疑这与引用这些属性之一的 LogManager 的实现有关。但是,我想尝试了解我的等效假设是否正确。

澄清一下:我对这个问题的目标是了解行为是否应该是相同的。

【问题讨论】:

    标签: java java.util.logging


    【解决方案1】:

    之所以有两种不同的方式是由于New Features in J2SE 5.0。在 J2SE 1.4 中,您只能使用 handlers 属性来 add handlers to the root logger

    根据 Java 1.4 LogManager JavaDocs:

    属性“处理程序”。这定义了一个以空格分隔的类名列表,供处理程序类加载并注册为根 Logger(名为“”的 Logger)上的处理程序。每个类名都必须是具有默认构造函数的 Handler 类。请注意,这些 Handler 在第一次使用时可能会延迟创建。

    从您发布的 JavaDocs 中可以看出,文档已被修改,删除了关于延迟创建的部分。

    在 Java 5 中,JDK-4635817 : Attaching handlers to loggers using logging config file 已通过允许使用 .handlers 得到修复。由于向后兼容,LogManager 必须同时支持新旧两种方式来安装处理程序。

    在大多数情况下,handlers.handlers 是等价的,除了:

    1. 使用handlers 只会在将 LogRecord 发布到根记录器处理程序时加载您的处理程序。如果您从不记录任何内容,则永远不会加载处理程序。
    2. 使用.handlers 将在创建根记录器期间附加您的处理程序。
    3. 如果同时使用这两个属性,则使用规则 #1 和 #2 将两个属性的并集应用到根记录器。

    LogManager 的子类,如 Tomcat 中使用的 org.apache.juli.ClassLoaderLogManager apply different rules from what is listed above

    JDK 9 有一个回归,它将在 .handlers 无法正常工作的地方得到修复。归档于:JDK-8191033 Regression in logging.properties: specifying .handlers= for root logger (instead of handlers=) no longer works

    【讨论】:

    • 非常感谢!所以我能够从 LogManager 的源代码中确定这种行为,但无法确定原因。这些链接非常有帮助。我希望这在文档中得到更好的澄清。
    【解决方案2】:

    翻看LogManager的源码,看起来“.handlers”和“handlers”这2个属性的处理方式略有不同。

    如果存在属性“handlers”,则会导致根记录器的处理程序在任何其他记录器的处理程序之前为initialized。如果使用“.handlers”来代替,这个初始化将会发生,但比日志管理器预期的要晚。

    您看到的“奇怪的事情”可能与这个延迟的初始化处理程序有关。

    【讨论】:

    • 这是我在调试本地版本(来自 OpenJDK)时看到的。但是,我试图了解 LogManager 是否应该将两者视为等效。
    猜你喜欢
    • 2023-03-29
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多