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

时间:2016-04-19 18:19:19

标签: java java.util.logging

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

  

属性"处理程序"。这定义了空格或逗号分隔   要加载和注册的处理程序类的类名列表   根记录器上的处理程序(记录器名为"")。

     

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

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

handlers = myHandler
.handlers = myHandler

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

根据Java 1.4 LogManager JavaDocs:

  

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

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

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

大部分handlers.handlers都是等效的,除了:

  1. 使用handlers只会在将LogRecord发布到根记录器处理程序时加载处理程序。如果您从未记录任何内容,则永远不会加载处理程序。
  2. 使用.handlers将在创建根记录器期间附加处理程序。
  3. 如果同时使用两者,则使用规则#1和#2将两个属性的并集应用于根记录器。
  4. Tomcat org.apache.juli.ClassLoaderLogManager中使用的apply different rules from what is listed above之类的LogManager子类。

    JDK 9的回归将在.handlers无效的情况下得到修复。这是在JDK-8191033 Regression in logging.properties: specifying .handlers= for root logger (instead of handlers=) no longer works下提交的。

答案 1 :(得分:1)

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

属性“处理程序”(如果存在)会导致root logger的处理程序在任何其他记录程序的处理程序之前为initialized。如果使用“.handlers”,则会发生此初始化,但会晚于日志管理器的预期。

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