切割Nginx日志文件

以前用Apache的时候有自带个叫rotatelogs的工具,只需要修改httpd.conf文件就可以轻松简单分割日志文件。
不过Nginx并没有自带这样的工具,还需要写脚本用crontab执行。

#!/bin/bash
#设置日志文件目录
logs_path="/home/wwwlogs/"
#设置pid文件
pid_path="/usr/local/nginx/logs/nginx.pid"

#重命名日志文件
mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log

#向nginx主进程发信号重新打开日志
kill -USR1 `cat ${pid_path}`

其中日志文件目录和pid目录请根据自已的情况更改,pid文件存放的目录打开nginx.conf就可以看到了。

平常kill命令经常拿来杀进程,在这里用了个-USR1参数,在网上查了一下,有这样一段说明:

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

真素打开了新世界的大门

最后把上面那段脚本保存,比如我们存在/usr/local/nginx/rotatelogs.sh
然后设置每天凌晨12点执行这段脚本:

0 0 * * * bash /usr/local/nginx/rotatelogs.sh

如果你有多个网站,多个日志的话,在重命名日志文件那里多加相应的几个进去就可以了。
像博主这样VPS没有默认安装crontab的,可以yum install crontabs。
然后再使用crontab -e命令进行脚本的添加。
一般来说都会打开一个vi编辑器,具体就请参照vi编辑器的用法啦。

补充:

在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+%Y%m%d’。
我们的脚本里也有类似的表示日期的,不过不是直接写在crontab里就不用考虑转义了。

参考:

nginx日志切割

标签:Nginx 发布于:2019-10-27 12:05:14