在java.util.logging logging.properties文件中,"处理程序"和".handlers"之间有什么区别?

Uri*_*Uri 2 java java.util.logging

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

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

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

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

handlers = myHandler
.handlers = myHandler
Run Code Online (Sandbox Code Playgroud)

以下是JDK的lib/logging.properties文件中的示例:

handlers= java.util.logging.ConsoleHandler
.level= INFO
Run Code Online (Sandbox Code Playgroud)

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

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

jme*_*ens 5

有两种不同方式的原因是由于J2SE 5.0中的新功能.在J2SE 1.4中,您只能使用属性向根记录器添加处理程序handlers.

根据Java 1.4 LogManager JavaDocs:

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

正如您在JavaDocs中看到的那样,您发布的文档已被修改,删除了有关lazily创建的部分.

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

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

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

像Tomcat中使用的org.apache.juli.ClassLoaderLogManager这样的LogManager的子类应用与上面列出的规则不同的规则.

JDK 9的回归将在.handlers无法正常工作的地方得到修复.这是归档于:JDK-8191033 logging.properties中的回归:指定.handlers = for root logger(而不是handlers =)不再有效.