Nginx日志切割及定期删除shell脚本

Nginx的日志会忠实的的记录访客对服务器发起的每一次请求,因此随着时间的推移日志文件会越来越大,部分日志长时间不维护可能多达上百G。

另外日志本身记录了服务器运行的诸多有用信息,因此无论是从服务器安全角度或者是大数据分析角度,如何高效得处理日志文件是玩转Linux服务器的一项基本功。

今天给大家分享一个Nginx日志切割脚本,配合Crontab定时任务可以实现日志的自动切割、归档与删除。


#!/bin/bash
#日志所在文件夹
LOGS_PATH=/home/wwwlogs
#日志名称
LOGS_NAME=access.log
#取得日期
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
#按天切割日志
mv ${LOGS_PATH}/${LOGS_NAME} ${LOGS_PATH}/${YESTERDAY}.log
#向 Nginx 主进程发送 USR1 信号,重新打开日志文件,否则会继续往mv后的文件写内容,导致切割失败.
kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'`
#删除7天前的日志
#cd ${LOGS_PATH}
#find . -mtime +7 -name "*20[1-9][3-9]*" | xargs rm -f
exit 0

脚本在移动原日志文件后会向 Nginx 主进程发送 USR1 信号,重新打开日志文件,USR1通常被用来告知应用程序重载配置文件。

例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。

将脚本写入crontab定时任务每天执行一次即可:

1 0 * * * /root/shell/logsSplit.sh