nginx日志分割

为什么要日志分割

工作中 Nginx 日志基本为 access_log 和 error_log,配置启动后就开始产生日志文件,日积月累的,这个日志文件会越来越大。 当我们维护服务器的时候,查看日志会很难使用,针对这种情况,采用日志切割,并且实现自动删除旧日志;以下收集了 3 种方法,其中 2 种已经使用过;

1. nginx 配置自动分割(不推荐)

在 nginx 配置文件中 server 模块使用 $time_iso8601 变量分割日志

在配置文件中 $time_iso8601 变量正则匹配输出 $time 变量,并再生成对应的日期日志文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
server{

	if ($time_iso8601 ~ "(\d{4})-(\d{2})-(\d{2})") {
		set $time $1$2$3;
	}

	access_log  /home/nginx/logs/access_${time}.log  main;

	# 最终生成 /home/nginx/logs/access_20190720.log

	...
}

缺点

此变量只对 accesslog 有效,对 error_log 无效,error_log 使用后会显示 error${time}.log,故不推荐使用! 不> 能实现自动删除旧日志

2. 脚本自动分割(未使用)

未使用过,大致整合他人经验,如需使用建议测试。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#! /bin/bash/
# 假设脚本路径在/home/nginx/nginx_log.sh
# 假设nginx的日志存放路径为/home/nginx/logs

d=`date -d "-1 day" +%Y%m%d`      				# 定义时间(昨天的日期)
logdir="/home/nginx/logs"       		  		# 定义日志存放路径
nginx_pid="/usr/local/nginx/logs/nginx.pid"     # 定义NginxPid存放路径
cd $logdir              						# 进入到日志目录下
for log in `ls *.log`          					# for循环匹配
do
    mv $log $log-$d     						# 更改所有配置文件的名字
done
/bin/kill -HUP `cat $nginx_pid`

配置好切割脚本以后可以执行测试一下脚本 sh -x 加上脚本路径 -x 后缀可以显示出脚本执行过程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[root@aming-01 vhost]# sh -x /home/nginx/nginx_log.sh
++ date -d '-1 day' +%Y%m%d
+ d=20100725
+ logdir=/home/nginx/logs
+ nginx_pid=/usr/local/nginx/logs/nginx.pid
+ cd /home/nginx/logs
++ ls test.com.log
+ for log in '`ls *.log`'
+ mv test.com.log test.com.log-20180425
++ cat /usr/local/nginx/logs/nginx.pid
+ /bin/kill -HUP 1089

写完脚本以后还需要加上一个任务计划使用 crontab -e 命令

1
2
crontab -e  									# 进入vi模式编写crontab
0 0 * * * /bin/bash /home/nginx/nginx_log.sh    # 表示每天凌晨0点执行脚本