如何让 Apache 日志的时间戳精确到毫秒?
Apache 默认日志时间只到秒。在 LogFormat 中用 %{ms}T 或自定义时间格式 %{%Y-%m-%d %H:%M:%S}t 加 %{usec_frac}t 可实现毫秒精度。本文给出配置方法。
做法:修改 Apache 配置中的 LogFormat,使用 %{begin:...}t 自定义时间格式并加入 %{usec_frac}t(微秒小数部分),即可得到毫秒甚至微秒精度的时间戳。
配置方法
编辑 Apache 配置文件(httpd.conf 或虚拟主机配置),找到或新增 LogFormat:
# 自定义带毫秒的时间格式
LogFormat "%a %l %u %{%Y-%m-%d %H:%M:%S}t.%{usec_frac}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined_ms
# 应用到访问日志
CustomLog /var/log/apache2/access.log combined_ms
%{%Y-%m-%d %H:%M:%S}t:格式化时间到秒;%{usec_frac}t:微秒小数部分(如.123456),拼接后即毫秒/微秒精度。
改完检查配置并平滑重载:
apachectl configtest
systemctl reload apache2 # 或 httpd
输出效果
192.168.1.1 - - 2024-01-15 10:30:45.123456 "GET /api/users HTTP/1.1" 200 1234 "-" "Mozilla/5.0"
相关:请求耗时也建议记录
# %D:请求处理耗时(微秒);%T:秒
LogFormat "%a ... %D" with_duration
排查性能问题时,%D(处理时长)比单纯的时间戳更有用。
观测云对照
观测云的 Nginx/Apache 集成在采集访问日志时自动解析时间和请求耗时字段,在控制台直接查看延迟分布,不需要手动调日志格式。
常见问题(FAQ)
Q:%t 默认格式是什么?
A:[15/Jan/2024:10:30:45 +0800],精度只到秒,且是英文月份格式,不利于机器解析。
Q:改了格式后旧日志还能用吗?
A:旧日志保持原格式不变,新日志用新格式。下游解析程序需要兼容两种格式或从切换点开始。
Q:Nginx 怎么记毫秒?
A:Nginx 的 $time_iso8601 到秒,$msec 是带毫秒的时间戳(如 1705287045.123),直接加入 log_format 即可。