问题描述
我从 the official documentation 了解到轮换是在午夜完成的:
rotatable - 如果为 true,日志文件将在午夜后的第一次写入时旋转,文件名将为 {prefix}{date}{suffix},其中日期为 yyyy-MM-dd。如果为 false,文件将不会旋转,文件名将为 {prefix}{suffix}。默认值:true
轮换是在本地系统时间完成的。我如何配置文件处理程序以在 GMT 或任何一般时区旋转?
解决方法
需要明确的是,它不会在午夜轮换。旋转触发器不是基于挂钟时间的概念。当日志记录通过发布方法时,会触发旋转。这意味着可以根据日志消息流延迟轮换。
根据 org.apache.juli.FileHandler::publish
的 Tomcat 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 中配置时区。