首页 > 解决方案 > org.apache.juli.FileHandler 在 GMT 中轮换

问题描述

我从官方文档中了解到轮换是在午夜完成的:

rotatable - 如果为 true,日志文件将在午夜之后的第一次写入时轮换,文件名将是 {prefix}{date}{suffix},其中日期是 yyyy-MM-dd。如果为 false,则不会旋转文件并且文件名将是 {prefix}{suffix}。默认值:真

旋转在本地系统时间完成。我如何配置文件处理程序以在 GMT 或任何时区中轮换?

标签: javaloggingfilehandler

解决方案


需要明确的是,它不会在午夜旋转。旋转触发器不是基于挂钟时间的概念。当日志记录通过发布方法时,会触发轮换。这意味着可以根据日志消息的流向延迟轮换。

根据Tomcat 9.x源代码org.apache.juli.FileHandler::publish

 // Construct the timestamp we will use, if requested
 Timestamp ts = new Timestamp(System.currentTimeMillis());
 String tsDate = ts.toString().substring(0, 10);

在这种情况下,Timestamp 是 java.sql.Timestamp 并且是 java.util.Date 的扩展。

Per如何设置 java.util.Date 的时区?JVM 的默认时区仅适用于此处使用的日期的 toString。

您可以在 GMT 中进行轮换的唯一开箱即用的方法是设置 JVM 的默认时区。但是,这将对您的应用程序的所有日期和时间戳产生全球影响。如果您不希望轮换被延迟,那么您需要确保发布日志记录。

更好的解决方案是针对 Tomcat 源代码创建问题并修补 org.apache.juli.FileHandler 以允许 rotatable 接受java.time.OffsetTime::parse接受的布尔值或字符串。这将允许配置:

org.apache.juli.FileHandler.rotate=00:00:00+01:00

即使使用java.text.SimpleDateFormat也允许在 org.apache.juli.FileHandler 中配置时区。


推荐阅读