System.currentTimeMillis() 用于记录日志触发的精确时刻,它返回自1970-01-01 UTC起的毫秒数,精度高、开销小、线程安全;应在业务逻辑入口处立即调用,而非依赖日志框架自动添加的时间,以准确捕获事件发生时刻。

直接用 System.currentTimeMillis() 获取当前时间戳,再把它写进日志里,就能记录日志触发的精确时刻。
为什么用 currentTimeMillis 记录触发时间
它返回的是自 1970-01-01 00:00:00 UTC 起经过的毫秒数,精度高、开销小、线程安全,适合在日志打点时快速捕获“那一刻”的时间。注意:它反映的是调用该方法那一瞬间的系统时间,不是日志最终写入文件或发送到远端的时间。
在日志语句中嵌入时间戳
最常见做法是在打印日志前立即获取时间戳,然后拼入日志内容:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 使用 SLF4J 或 Log4j 时,通常不手动拼时间戳,而是靠日志框架自动添加(如配置 pattern 中含
%d{yyyy-MM-dd HH:mm:ss.SSS}); - 若需单独记录“业务触发时刻”(比如某个方法入口、事件发生点),可在关键位置显式调用:
long triggerTime = System.currentTimeMillis();
logger.info("订单创建触发,ts={}", triggerTime); - 避免在日志格式化之后才取时间戳,否则会记录日志准备完成的时间,而非业务动作发生的实际时间。
和日志框架自带时间的区别
日志框架(如 Logback)默认会在每条日志开头加一个时间字段,那个时间也是基于 currentTimeMillis(或更优的 System.nanoTime() 配合时钟校准)生成的,但它是日志事件构建时的时间。如果你关心的是“用户点击按钮”“消息到达”这类业务事件的发生时间,建议在业务逻辑入口处主动捕获并传入日志上下文,而不是依赖框架自动打的时间——因为中间可能有队列、拦截器、序列化等延迟。
立即学习“Java免费学习笔记(深入)”;
注意事项
- 不要重复封装或缓存这个值用于多条日志,每次触发都应重新调用,保证时间准确性;
- 如果需要纳秒级精度(极少场景),可考虑
System.nanoTime(),但它不能转为真实时间,只适合计算耗时; - 跨服务调用时,单靠本机时间戳无法对齐全局顺序,需结合 TraceID 或分布式时钟(如 Google TrueTime、混合逻辑时钟);
- 服务器时钟不同步会影响时间可信度,生产环境务必开启 NTP 同步。

















