java - org.apache.juli.FileHandler 在 GMT 中轮换
问题描述
我从官方文档中了解到轮换是在午夜完成的:
rotatable - 如果为 true,日志文件将在午夜之后的第一次写入时轮换,文件名将是 {prefix}{date}{suffix},其中日期是 yyyy-MM-dd。如果为 false,则不会旋转文件并且文件名将是 {prefix}{suffix}。默认值:真
旋转在本地系统时间完成。我如何配置文件处理程序以在 GMT 或任何时区中轮换?
解决方案
需要明确的是,它不会在午夜旋转。旋转触发器不是基于挂钟时间的概念。当日志记录通过发布方法时,会触发轮换。这意味着可以根据日志消息的流向延迟轮换。
根据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 中配置时区。
推荐阅读
- python - 如何在 django-mptt 中显示一定数量的级别?
- java - 构建后从文件自定义密码策略
- c# - 针对 UWP 14393 / .net 标准 1.4 时,HTTPS x509 客户端身份验证不起作用
- android-library - 由于 Android SDK 许可协议,JitPack 构建失败
- php - 插入数据库不起作用
- sql - 显示 Oracle DB 中表的上次访问时间
- python - 如何从 python 中的 cursor.execute() 中读取所有数据?
- oracle - MONTHS_BETWEEN / NTH_VALUE
- postgresql-9.5 - pgAgent 根据当前时间戳触发动作
- node.js - 将 MEAN 应用部署到 Heroku 空白页面