nginx 日志小记

nginx 默认的日志有特定的格式,我们也可以自定义,

默认的格式是预定义的 combined

1
2
3
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';

配置的日志可以使用这个默认的,如果满足需求的话

1
2
3
4
Syntax:	access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except

而如果需要额外的一些配置的话可以自己定义 log_format ,比如我想要给日志里加上请求时间,那就可以自己定义一个 log_format 比如添加下

1
2
3
$request_time
request processing time in seconds with a milliseconds resolution;
time elapsed between the first bytes were read from the client and the log write after the last bytes were sent to the client
1
2
3
log_format combined_extend '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$request_time"';

然后其他的比如还有 gzip 压缩,可以设置压缩级别,flush 刷盘时间还有根据条件控制

这里的条件控制简单看了下还比较厉害

比如我想对2xx 跟 3xx 的访问不记录日志

1
2
3
4
5
6
map $status $loggable {
~^[23] 0;
default 1;
}

access_log /path/to/access.log combined if=$loggable;

$loggable 是 0 或者空时表示 if 条件为否,上面的默认就是 1,只有当请求状态 status 是 2xx 或 3xx 时才是 0,代表不用记录,有了这个特性就可以更灵活地配置日志

文章主要参考了 nginx 的 log 模块的文档