Nginx修改日志时间格式
以下是基于 yum 安装的 Nginx 修改日志时间格式的完整方案,结合配置方法与常见问题解决:
一、默认时间格式的问题
通过 yum
安装的 Nginx 默认提供两种时间格式变量:
$time_local
:01/Jul/2020:03:25:17 +0800
(本地时间)$time_iso8601
:2023-09-12T13:54:22+08:00
(ISO8601 格式)
你的问题:
192.168.2.1 - - [09/May/2025:15:28:33 +0800] "GET /mall/hello HTTP/1.1" 200 67 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0" "-"
127.0.0.1 - - [09/May/2025:16:49:21 +0800] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
想要的结果:
192.168.2.1 - - [2025-05-09 16:53:58] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0" "-"
127.0.0.1 - - [2025-05-09 17:02:16] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
若需自定义为 YYYY-MM-DD HH:mm:ss
格式,需通过变量提取重组实现。
二、全局配置方案(推荐)
通过 map
指令在 http
块内全局定义时间变量,避免重复修改 server
块:
# /etc/nginx/nginx.conf
http {map $time_iso8601 $log_time {default "";"~^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})T(?<hour>\d{2}):(?<minutes>\d{2}):(?<date_seconds>\d{2})" "${year}-${month}-${day} ${hour}:${minutes}:${date_seconds}";}log_format main '$log_time|$remote_addr|$request';access_log /var/log/nginx/access.log main;
}
说明 :
- 输入变量:
$time_iso8601
,输出变量为$log_time
。 - 正则提取:通过命名捕获组提取年、月、日等字段。
- 格式重组:将提取的字段拼接为
2023-09-12 13:54:22
格式。
三、分 Server 配置方案(备用)
若需兼容旧版本,可在每个 server
块内添加 if
语句:
server {listen 80;if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") {set $year $1;set $month $2;set $day $3;set $hour $4;set $minutes $5;set $seconds $6;}log_format custom '$year-$month-$day $hour:$minutes:$seconds|$remote_addr';access_log /var/log/nginx/custom.log custom;
}
缺点 :
- 需在每个
server
块重复添加,维护成本高。 if
语句可能引发性能损耗(极端高并发场景)。
四、验证与生效步骤
- 检查配置语法:
nginx -t -c /etc/nginx/nginx.conf
- 重载配置:
nginx -s reload
- 验证日志格式:
tail -n 5 /var/log/nginx/access.log
-
预期输出示例:
2025-05-09 14:30:15|192.168.1.1|GET / HTTP/1.1