繁体   English   中英

在java.util.logging logging.properties文件中,“ handlers”和“ .handlers”之间有什么区别?

[英]In a java.util.logging logging.properties file, what's the difference between “handlers” and “.handlers”?

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

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

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

由于根记录器的名称是空字符串(“”),因此在我看来,以下两个子句应等效:

handlers = myHandler
.handlers = myHandler

这是来自JDK的lib / logging.properties文件的示例:

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

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

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

之所以有两种不同的方式,是由于J2SE 5.0中的新功能 在J2SE 1.4中,只能使用handlers属性将处理程序添加到根记录器

根据Java 1.4 LogManager JavaDocs:

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

正如您从JavaDocs中看到的那样,发布的文档已经过修订,删除了关于懒惰创建的部分。

在Java 5中, JDK-4635817:允许通过使用.handlers来解决使用日志记录配置文件将处理程序附加到记录器.handlers由于向后兼容,LogManager必须支持安装处理程序的旧方法和新方法。

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

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

Tomcat中使用的LogManager子类(例如org.apache.juli.ClassLoaderLogManager) 应用与上面列出的规则不同的规则

JDK 9的回归将修复.handlers无法正常工作的地方。 该文件位于: JDK-8191033 logging.properties中的回归:不再为root logger指定.handlers =(而不是handlers =)

查看LogManager的源代码,看起来两个属性“ .handlers”和“ handlers”略有不同。

属性“ handlers”(如果存在)将导致根记录程序的处理程序先于其他记录程序的处理程序被初始化 如果使用“ .handlers”,则将进行此初始化,但比日志管理器期望的要晚。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM