JDK 中提供的 java.util.logging 默认实现过于有限,无法实用。主要限制是无法实现每个 Web 应用程序的日志记录,因为配置是基于每个 VM 的。因此,Tomcat 在默认配置下,将用一个名为 JULI 的容器友好型实现替换默认的 LogManager 实现,以解决这些缺点。
JULI 支持与标准 JDK java.util.logging 相同的配置机制,可以使用编程方式或属性文件。主要区别在于可以设置每个类加载器的属性文件(这使得 Web 应用配置易于重新部署),并且属性文件支持扩展的构造,为定义处理程序并将其分配给日志记录器提供了更大的自由度。
JULI 默认启用,除了常规的全局 java.util.logging 配置外,还支持每个类加载器的配置。这意味着日志记录可以在以下层进行配置
全局。这通常在 ${catalina.base}/conf/logging.properties 文件中完成。该文件由启动脚本设置的 java.util.logging.config.file 系统属性指定。如果该文件不可读或未配置,则默认使用 JRE 中的 ${java.home}/lib/logging.properties 文件。
在 Web 应用程序中。文件将是 WEB-INF/classes/logging.properties
JRE 中默认的 logging.properties 指定了一个 ConsoleHandler,它将日志路由到 System.err。Apache Tomcat 中默认的 conf/logging.properties 还添加了几个写入文件的 AsyncFileHandler。
处理程序的日志级别阈值默认为 INFO,可以使用 SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST 或 ALL 进行设置。您还可以针对特定包收集日志并指定一个级别。
要启用 Tomcat 内部一部分的调试日志记录,您应该配置相应的日志记录器和处理程序,以使用 FINEST 或 ALL 级别。例如:
org.apache.catalina.session.level=ALL
java.util.logging.ConsoleHandler.level=ALL
启用调试日志记录时,建议在尽可能窄的范围内启用,因为调试日志记录会生成大量信息。
JULI 使用的配置与普通的 java.util.logging 支持的配置相同,但使用了一些扩展以在配置日志记录器和处理程序时提供更好的灵活性。主要区别在于
可以在处理程序名称前添加前缀,以便可以实例化同一个类的多个处理程序。前缀是一个以数字开头,以 '.' 结尾的字符串。例如,22foobar. 是一个有效前缀。
对于包含 ${systemPropertyName} 的属性值,将执行系统属性替换。
如果使用实现了 org.apache.juli.WebappProperties 接口的类加载器(Tomcat 的 Web 应用程序类加载器就是如此),那么还会对 ${classloader.webappName}、${classloader.hostName} 和 ${classloader.serviceName} 执行属性替换,它们将分别替换为 Web 应用程序名称、主机名和服务名称。
默认情况下,如果日志记录器有相关的处理程序,它们将不会委托给其父级。这可以通过使用 loggerName.useParentHandlers 属性按日志记录器进行更改,该属性接受一个布尔值。
根日志记录器可以使用 .handlers 属性定义其处理程序集。
默认情况下,日志文件将在文件系统上保留 90 天。这可以通过使用 handlerName.maxDays 属性按处理程序进行更改。如果属性的指定值 ≤0,则日志文件将永远保留在文件系统上,否则将保留指定的最大天数。
还有几个额外的实现类,可以与 Java 提供的类一起使用。值得注意的是 org.apache.juli.FileHandler 和 org.apache.juli.AsyncFileHandler。
org.apache.juli.FileHandler 支持日志缓冲。默认情况下不启用缓冲。要配置它,请使用处理程序的 bufferSize 属性。值为 0 时使用系统默认缓冲(通常会使用 8K 缓冲区)。值为 <0 时强制每次日志写入时刷新写入器。值为 >0 时使用带有定义值的 BufferedOutputStream,但请注意,系统默认缓冲也将被应用。
org.apache.juli.AsyncFileHandler 是 FileHandler 的一个子类,它将日志消息排队并异步写入日志文件。其额外行为可以通过设置一些系统属性进行配置。
示例 logging.properties 文件,放置在 $CATALINA_BASE/conf 中
handlers = 1catalina.org.apache.juli.AsyncFileHandler, \
2localhost.org.apache.juli.AsyncFileHandler, \
3manager.org.apache.juli.AsyncFileHandler, \
java.util.logging.ConsoleHandler
.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
1catalina.org.apache.juli.AsyncFileHandler.level = ALL
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
1catalina.org.apache.juli.AsyncFileHandler.maxDays = 90
1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8
2localhost.org.apache.juli.AsyncFileHandler.level = ALL
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
2localhost.org.apache.juli.AsyncFileHandler.maxDays = 90
2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8
3manager.org.apache.juli.AsyncFileHandler.level = ALL
3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.AsyncFileHandler.prefix = manager.
3manager.org.apache.juli.AsyncFileHandler.bufferSize = 16384
3manager.org.apache.juli.AsyncFileHandler.maxDays = 90
3manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.OneLineFormatter
java.util.logging.ConsoleHandler.encoding = UTF-8
############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \
2localhost.org.apache.juli.AsyncFileHandler
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \
3manager.org.apache.juli.AsyncFileHandler
# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = FINE
用于 servlet-examples Web 应用程序的 logging.properties 示例,放置在 Web 应用程序内部的 WEB-INF/classes 中
handlers = org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
org.apache.juli.AsyncFileHandler.level = ALL
org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
org.apache.juli.AsyncFileHandler.prefix = ${classloader.webappName}.
org.apache.juli.AsyncFileHandler.encoding = UTF-8
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.OneLineFormatter
java.util.logging.ConsoleHandler.encoding = UTF-8
文档参考
有关其他信息,请参阅以下资源
Apache Tomcat 关于 org.apache.juli 包的 Javadoc 文档。
Oracle Java 11 关于 java.util.logging 包的 Javadoc 文档。
生产环境使用注意事项
您可能需要注意以下事项
考虑从配置中移除 ConsoleHandler。默认情况下(由于 .handlers 设置),日志记录同时发送到 AsyncFileHandler 和 ConsoleHandler。后者的输出通常会被捕获到文件中,例如 catalina.out。因此,您会得到相同消息的两份副本。
考虑移除您不使用的应用程序的 AsyncFileHandler。例如,用于 host-manager 的。
考虑配置访问日志。
白花蛇舌草
赵日天作品大全