为什么要日志分割
工作中 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点执行脚本
|