Nginx日志配置与切割
Nginx日志配置与切割
Nginx 日志配置非常简单,首先使用log_format
指令配置一个格式。然后使用 access_log
(访问日志)、error_log
(错误日志)指令开启即可。
1 | http { |
条件日志
我们有一个心跳检测的服务,定期会向服务器发请求。这个请求每天会发很多次,这个请求的日志也是非常多的。这个日志没什么意义,可以把它忽略掉。
第一种方法就是配置一个location匹配到这个心跳检测接口将日志关掉。
1 | location = /_heartbeat { |
上面方法不是很灵活,我们要重复配置。有没有办法只配置一处就能做到呢?查看Nginx文档,发现有一个条件日志配置示例:
1 | http { |
日志切割
当 Nginx 接收到 USR1
时会重新打开日志文件。
1 | mv /var/log/nginx/access.log /var/log/nginx/access.log-20180706 |
上面方案很不灵活,需要手动处理。我们可以使用crontab或者logrotate来做到自动化。
crontab
1
2
3
4
5
6
7
8
9
10
11!/bin/bash
0 0 * * * 每天零点执行
LOG_PATH=/var/log/nginx
DATE=`date -d "yesterday" +%Y%m%d`
PID=`cat /var/run/nginx.pid`
cd $LOG_PATH
mv access.log access.log-$DATE && zip -mq access.log-$DATE.zip access.log-$DATE
kill -USR1 $PIDlogrotate
1
2
3
4
5
6
7
8
9
10
11
12
13
14/var/log/nginx/*.log {
daily
dateext
rotate 30
compress
delaycompress
notifempty
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}- 第一行要处理的日志,可以使用通配符。后面
{}
包裹日志切割的配置项。 - daily:表示每天执行一次,类似的配置还有weekly,monthly每周和每月。
- dateext:文件后缀使用日期命名。
- rotate 30:保留最近30天的日志。
- compress:对日志进行压缩。
- delaycompress:延迟压缩,分割完成后延迟一天压缩此日志。
- notifempty:忽略空日志。
- sharedscripts:执行脚本。
- postrotate:日志被切割后执行的脚本,对应的
prerotate
表示在切割前执行的脚本。 - endscript:标记脚本结束。
- 测试一下脚本:
logrotate -d /etc/logrotate.d/nginx
。 - 执行后面的命令能立即看到效果:
logrotate -vf /etc/logrotate.d/nginx
。
- 第一行要处理的日志,可以使用通配符。后面
输出JSON格式的日志
1 | log_format json escape=json '{' |
参考
本站采用「署名 4.0 国际」进行许可。