应优先使用日志框架自带时间格式化而非手动调用system.currenttimemillis(),因其准确、易解析且兼容elk等系统;需毫秒值时应先存局部变量再引用,避免偏差,并用占位符输出。

直接在日志语句中调用 System.currentTimeMillis() 即可输出毫秒级时间戳,但更推荐使用日志框架自带的时间格式化能力,既准确又便于后续分析。
为什么不用手动拼接 currentTimeMillis
虽然可以写成:log.info("处理完成,耗时:" + (System.currentTimeMillis() - start) + "ms");
但这种方式容易出错:比如忘记单位、混淆起止时间、无法对齐日志时间列、不兼容日志采集系统(如 ELK)的解析规则。
推荐方式:让日志框架自动打时间戳
主流日志框架(Log4j2、Logback)默认就在每条日志开头打印格式化后的时间(如 2024-05-20 14:23:11.892),无需代码干预。只需确认配置文件中启用了时间字段:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Logback(logback.xml):检查
<pattern></pattern>是否含%d,例如:%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n -
Log4j2(log4j2.xml):确认
PatternLayout的 pattern 包含%d,如:%d{ISO8601}{GMT+8} [%t] %-5p %c{1} - %m%n
需要毫秒级原始时间戳时怎么办
如果确实要记录某个操作的精确毫秒值(比如性能埋点),可用以下安全写法:
- 用局部变量先获取一次:
long ts = System.currentTimeMillis();,再在日志中引用,避免两次调用产生微小偏差 - 配合业务标识一起打,方便追踪:
log.debug("order_id=12345, timestamp_ms={}", ts); - 若用 SLF4J,优先用占位符而非字符串拼接,防止日志级别关闭时仍执行计算
补充:别把 currentTimeMillis 当“当前时间”来格式化
System.currentTimeMillis() 返回的是自 1970-01-01 00:00:00 UTC 起的毫秒数,它本身不是可读时间。如果硬要转成字符串,应交给 SimpleDateFormat 或 Instant.now().toString() 处理,而不是自己除以 1000 再拼年月日——容易时区出错且没必要。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










