Java中如何将日志的系统日期时间替换为epoch纪元时间
你当前遇到的自动附在日志开头的本地格式时间,是JDK自带日志框架(java.util.logging,简称JUL)的默认格式化逻辑生成的,和你业务代码里写的logger.info(str)没有关联,不需要修改业务层的日志调用代码,只要覆盖框架的日志格式化规则,就能移除默认本地时间、替换为epoch时间戳。
具体实现步骤
1. 核心逻辑说明
你给出的日志输出样式(开头为Mar 02, 2021 12:01:36 PM的本地化日期),和JUL默认SimpleFormatter的输出结构完全匹配,所有调整只需要作用在日志格式化层,不需要改动日志传递的业务内容。
2. 编写自定义格式化类
自定义一个继承java.util.logging.Formatter的类,重写格式化方法,用日志记录自带的epoch时间戳替换默认的日期格式化结果:
import java.util.logging.Formatter; import java.util.logging.LogRecord; public class EpochTimestampLogFormatter extends Formatter { @Override public String format(LogRecord record) { // 直接取日志记录内置的毫秒级epoch时间戳,不做本地化日期转换 long epochTime = record.getMillis(); // 保留原有日志结构,仅把原时间位置替换为epoch值 return String.format( "%d %s %s%n%s: %s%n", epochTime, // 原结构的调用类+方法名部分 record.getSourceClassName() + " " + record.getSourceMethodName(), // 日志级别 record.getLevel().getName(), // 你传入的日志内容 formatMessage(record) ); } }
如果需要秒级epoch时间,只需将
record.getMillis()除以1000即可,不需要额外引入时间计算逻辑。
3. 绑定自定义格式化规则
两种绑定方式按需选择:
- 代码初始化绑定:在应用启动最前期,遍历所有日志输出Handler,替换掉默认Formatter:
// 全局覆盖根日志的所有Handler格式 Logger rootLogger = Logger.getLogger(""); for (Handler handler : rootLogger.getHandlers()) { handler.setFormatter(new EpochTimestampLogFormatter()); } // 针对你的业务Logger(对应日志里的hardwarelog包路径)单独同步配置 Logger bizLogger = Logger.getLogger("hardwarelog"); for (Handler handler : bizLogger.getHandlers()) { handler.setFormatter(new EpochTimestampLogFormatter()); } - 配置文件绑定:找到项目类路径下的
logging.properties文件,直接指定全局使用的Formatter类,不需要写代码绑定:# 控制台输出替换为自定义格式 java.util.logging.ConsoleHandler.formatter = 你的类全限定名.EpochTimestampLogFormatter # 文件输出同步替换 java.util.logging.FileHandler.formatter = 你的类全限定名.EpochTimestampLogFormatter
关键注意点
- 不要尝试在
logger.info(str)传入的字符串里手动拼接epoch时间,日志框架依然会在输出最前面叠加默认的本地日期格式,造成冗余,无法达到移除默认时间的目的。 - 配置完成后,生成的日志样例为:
1614643296000 hardwarelog.CustomLogger writeLog INFO: {"status":true,"message":"success","status_code":200},完全移除原有的本地日期格式,替换为epoch时间戳。
内容的提问来源于stack exchange,提问作者Ananthu K Kumar
相关产品推荐
相关产品推荐

