在LogManager的文档中,以下是Handlers属性的设置:
属性"处理程序"。这定义了空格或逗号分隔 要加载和注册的处理程序类的类名列表 根记录器上的处理程序(记录器名为"")。
属性" .handlers"。这定义了一个空格或逗号 要加载的处理程序类的分隔的类名列表 注册为指定记录器的处理程序。每个类名必须是 对于具有默认构造函数的Handler类。请注意这些 处理程序可能会在首次使用时延迟创建。
由于根记录器的名称是空字符串(""),在我看来,下面的两个条款应该是等价的:
handlers = myHandler
.handlers = myHandler
以下是JDK的lib / logging.properties文件中的一个示例:
handlers= java.util.logging.ConsoleHandler
.level= INFO
当我尝试枚举根记录器上的处理程序时,我注意到发生了奇怪的事情。我怀疑这与LogManager的实现有关,指的是其中一个属性。但是,我想尝试理解我的假设是否正确。
澄清一下:我对这个问题的目标是了解行为是否是相同的。
答案 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
都是等效的,除了:
handlers
只会在将LogRecord发布到根记录器处理程序时加载处理程序。如果您从未记录任何内容,则永远不会加载处理程序。.handlers
将在创建根记录器期间附加处理程序。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”,则会发生此初始化,但会晚于日志管理器的预期。
您看到的“怪异事物”可能与此延迟初始化处理程序有关。