需求与思路
查询nginx日志时发现main-access.log已达到几十个G,即便是error.log也接近1G,才意识到一直忽视了日志文件的管理,这非常不利于日志的查询和问题的追踪,而人为切割有太多不确定性,所以实现nginx日志的自动切割是很有必要的。
我是通过shell脚本和cron定时服务实现linux平台下nginx日志自动切割的。
#!/bin/bash
#设定cron定时中午12点执行该脚本
#main-access.log日志所在目录
ACCESS_LOGS_PATH=/data/tengine/log#error.log日志所在目录
ERROR_LOGS_PATH=/data/tengine/log/nginx
#日志更名
mv ${ACCESS_LOGS_PATH}/main-access.log ${ACCESS_LOGS_PATH}/main-access_backup$(date +%Y%m%d%H%M).logmv ${ERROR_LOGS_PATH}/error.log ${ERROR_LOGS_PATH}/error_backup$(date +%Y%m%d%H%M).log#生成新的日志文件
kill -USR1 $(cat /data/tengine/nginx.pid)1234567891011121314
志更名规则:
mv 路径/文件名.log 路径/文件名+backup+当时时间.log
生成新日志指令解析:
cat /data/tengine/nginx.pid 是获取nginx的进程号,sh脚本里$开头表示变量,则相当于“kill -USR1 进程号”。USR1是nginx中定义的一个信号,“#define NGX_REOPEN_SIGNAL USR1”,这个信号是通过kill向进程发送的。
该行指令执行后,就会创建一个新的日志文件,和更名前的日志文件名称相同。
将创建好的脚本命名(我命名为autocut_log.sh),然后存放到nginx安装目录的sbin下,存放路径在设置定时任务的时候会用到。
2. 创建定时任务
编辑当前用户的定时任务
[root@localhost ~]#crontab -e1
编辑模式和vi编辑器相似,在末尾加如下两行:
#cut_nginx_log00 12 * * * /data/tengine/sbin/cut_log.sh12
该定时任务我是定在每天的12:00整运行的。保存退出,提示“crontab: installing new crontab”则说明定时任务创建成功,可以设置一个距当前较近的时间先测试一下是否成功。
.........................................................