![](/img/trans.png)
[英]Tomcat7 ignores java.util.logging in logging.properties
[英]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
是等效的,除了:
handlers
才会加载您的处理程序。 如果您从不记录任何内容,则永远不会加载处理程序。 .handlers
将在创建根记录器时附加您的处理程序。 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.