带毫秒的Nginx访问日志:时间格式疑问及添加方法咨询
1. 时间格式里的T是什么意思?
那个T是ISO 8601标准时间格式里的日期与时间分隔符,专门用来把日期段和时间段明确分开。就拿你给出的2018-03-20T04:11:42-07:00来说,2018-03-20是日期部分(年-月-日),T后面的04:11:42是具体时间(时:分:秒),最后的-07:00代表时区偏移(比UTC时间晚7小时)。这种格式是国际通用的标准时间表示法,Nginx里如果用了$time_iso8601这个内置变量生成日志时间,就会输出这种格式。
2. 怎么给日志时间添加毫秒部分?
要给Nginx日志时间加上毫秒,核心是修改日志格式配置,用到Nginx提供的毫秒相关变量。下面给你两种实用的配置方式:
方式一:在ISO 8601格式基础上补毫秒
如果你想保留原有的ISO 8601风格,只是加上毫秒,可以定义这样的日志格式:
log_format iso_with_ms '$remote_addr - $remote_user [$time_iso8601.$msec_ms] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
这里的$msec_ms是Nginx专门提供的变量,会提取出$msec(完整的秒+毫秒,比如1521539502.123)里的三位毫秒数。配置后日志时间会变成2018-03-20T04:11:42-07:00.123这种形式。
方式二:自定义带毫秒的时间格式
如果你偏好更直观的日期 时间.毫秒 时区格式,比如2018-03-20 04:11:42.123 -07:00,可以结合$time_local和$msec_ms来配置:
log_format custom_with_ms '$remote_addr - $remote_user [$time_local.$msec_ms] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
注意$time_local默认输出的是03/Mar/2018:04:11:42 -0700这种格式,如果需要严格的年-月-日形式,可能需要借助第三方扩展模块,但大多数场景下上面两种方式已经能满足需求。
配置完自定义日志格式后,要在对应的server或location块里指定使用这个格式,比如:
access_log /var/log/nginx/access.log iso_with_ms;
最后重启Nginx让配置生效:
sudo systemctl restart nginx
内容的提问来源于stack exchange,提问作者Unnikrishnan

