org.apache.juli.FileHandler 在格林威治标准时间旋转

问题描述

我从 the official documentation 了解到轮换是在午夜完成的:

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

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

解决方法

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

根据 org.apache.juli.FileHandler::publishTomcat 9.x source code

 // 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 的扩展。

根据 How to set time zone of a 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 中配置时区。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...