Nginx自定义日志中时间格式

背景

工作需要对接内部的日志中台,对日志打印有固定的格式要求,为了使Nginx的access日志也能被采集,需要对日志格式进行自定义,要求日志格式为:

yyyy-MM-dd HH:mm:ss.SSS LOG_LEVEL LOG_MSG ---> 时间格式+打印级别+业务日志

如:

23-11-18 17:34:23.738 DEBUG monitor-7 org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug:137: xxxxx

但目前我们Nginx按照默认格式配置,大致如下:

192.23.4.5 -- [18/Nov/2023L18:58:52 +0800] "GET /api/cluster HTTP/1.1" 200 155 "https://xxx.xx.xx.x"

时间格式无法不符合要求,并且未区分日志级别,因此,需要对日志打印格式进行自定义

自定义日志格式配置

1.重新定义日志格式

点击查看代码

复制代码
# 原日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "http_referer" "$http_user_agent" "$http_x_forwarded_for";

# 修改后日志格式
log_format main '$time_zh_ms $log_level - $remote_addr - $remote_user "$request" $status $body_bytes_sent "http_referer" "$http_user_agent" "$http_x_forwarded_for";

# 对比修改前后差异,其实就是
1.自定义了$time_zh_ms,在下面的配置中,将其设置为yyyy-MM-dd HH:mm:ss.SSS格式
2.自定义了$log_level,为日志打印级别,下面的配置中,将按照请求响应码来判断为何种日志打印级别

以上只是为了满足日志采集需要,其他字段可按实际情况变动

2.定义时间格式的转换

Nginx默认支持的时间格式为iso8601,此处我们需要通过获取到内置时间变量*time_iso8601* 和*msec*,具体配置如下:
点击查看代码

复制代码
# 将iso8601格式时间转换为yyyy-MM-dd HH:mm:ss格式
# 按照正则将时间字符串分割为6部分,分别为年月日时分秒,再拼接到$time_zh自定义变量中
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;
  set $time_zh "$1-$2-$3 $4:$5:$6";
}

# 获取毫秒时间戳,并拼接到$time_zh之后
if ($msec ~ "(\d+)\.(\d+)") {
  set $time_zh_ms $time_zh.$2
}

# 注意:$time_zh_ms其实就是在log_format中定义的日志格式第一个字段

3.根据响应码定义日志级别

Nginx的access日志默认是没有日志级别这一说法的,此处可视为我们为了适配业务而做的规则,在我们的使用场景中,将返回码为4或5的请求,视为错误,打印为ERROR级别,其他请求为INFO级别
点击查看代码

复制代码
# 如果http返回码为4或5开头,则设置log_level为ERROR,否则为INFO
map $status $log_level {
  ~^[45] ERROR;
  default INFO;
}

# 此处$status为Nginx内置变量,代表请求的响应码,log_level为自定义变量

4.设置日志使用具体格式并打印到文件

点击查看代码

复制代码
access_log /dev/stdout main;
access_log /etc/nginx/logs/access.log main;
error_log /dev/stdout;
error_log /etc/nginx/logs/error.log;

5.完整配置示例截图

6.日志打印效果

相关推荐
tgethe38 分钟前
Nginx笔记
运维·笔记·nginx
invicinble1 小时前
对于nginx(一,认识nginx)
运维·nginx
徒手千行代码无bug1 小时前
Nginx upstream 负载均衡 404,单节点转发正常的根因与解决
运维·nginx·负载均衡
irisart2 小时前
第二章【NGINX 开源功能】—— 七层反向代理(下)
运维·nginx
xixiyuguang2 小时前
nginx tar离线安装 ubuntu22.04
运维·nginx
丁丁丁梦涛2 小时前
nginx解决域名代理到IP+端口的平台静态资源和接口地址问题
运维·tcp/ip·nginx
苹果醋33 小时前
24.记录Vue项目iview组件日期获取时间少一天
java·运维·spring boot·mysql·nginx
丁丁丁梦涛3 小时前
nginx在多层服务器代理接口地址的应用
运维·服务器·nginx
三七吃山漆3 小时前
攻防世界——Web_php_wrong_nginx_config
开发语言·nginx·安全·web安全·网络安全·php·ctf
码里法17 小时前
centos安装nginx并配置https完整版
nginx·https·centos