在 nginx 里,“日志时间”通常分 两种需求,对应不同的调整方式:
nginx 默认日志时间格式是固定的,不能直接修改成任意格式,但可以通过 变量组合 或 syslog 方式调整。
默认 log_format 中时间一般来自:
$time_local
示例:
08/Sep/2024:10:23:45 +0800
$time_iso8601(推荐,标准时间)如果你希望日志时间是 ISO8601 格式(便于日志系统解析):
http {
log_format main '$remote_addr - $remote_user [$time_iso8601] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main;
}
输出示例:
2024-09-08T10:23:45+08:00
✅ 不需要改系统时间
✅ 推荐用于 ELK / Loki / 日志平台
nginx 不直接支持 strftime,但可以用 $time_iso8601 做字符串截取:
log_format main '[$time_iso8601] "$request" $status';
或:
map $time_iso8601 $log_time {
"~^(?<year>\d{4})-(?<mon>\d{2})-(?<day>\d{2})" "$year$mon$day";
}
log_format main '$log_time "$request"';
nginx 不会自己处理时区,它使用的是:
操作系统时区
timedatectl
# 或
date
timedatectl set-timezone Asia/Shanghai
然后 重启 nginx:
nginx -s reload
# 或
systemctl restart nginx
⚠️ 注意:
docker run -e TZ=Asia/Shanghai ...
或在 Dockerfile:
ENV TZ=Asia/Shanghai
| 需求 | 解决方案 |
|---|---|
| 日志时间格式不好看 | 使用 $time_iso8601 |
| 想改成自定义格式 | nginx 不直接支持,用 map 截取 |
| 时间差 8 小时 | 修改系统时区 |
| Docker 日志时间不对 | 设置 TZ 环境变量 |
http {
log_format main '[$time_iso8601] $remote_addr "$request" '
'$status $body_bytes_sent';
access_log /var/log/nginx/access.log main;
}
如果你愿意,可以告诉我:
我可以给你 完全可直接用的配置。