最简单自动切割 nginx 访问日志示例

网站上线后,没怎么注意过日志,有一天需要查日志时,才发现竟然有 100 多个 G,一个文本文件竟然有 100 多个G,这也太大了。

nginx 是一个非常轻量的 web 服务器,体积小、性能高、速度快等诸多优点。但不足的是也存在缺点,比如其产生的访问日志文件一直就是一个,不会自动地进行切割,如果访问量很大的话,将导致日志文件容量非常大,不便于管理。当然了,我们也不希望看到这么庞大的一个访问日志文件,那需要手动对这个文件进行切割。

整体思路:

由于 nginx 的日志,都是写在一个文件中的,具体由我们的 nginx.conf 配置文件来决定,比如 access.log,那么我们可以在每天晚上 12 点,也就是每天0点,把这个 access.log 文件,重新命名一下,比如命令为 access_2017-11-22.log,之后再让 nginx 重新写一个 access.log 文件,这样就可以达到每天一个日志文件,之后再想去查找,或管理,也方便很多啦。

具体实现:

整个操作只涉及到了 重命名文件,以及让 nginx 重新打开一下日志文件,所以可以简单的来讲一个 shell 脚本来实现,再结合 linux crontab 计划任务,让脚本在每天零点执行即可。

脚本如下:

cat /usr/local/nginx/sbin/cut_nginx_logs.sh
    #!/bin/bash

    #指定 nginx 日志文件路径
    Logs_Path=/usr/local/nginx/logs

    #获取昨天的日期
    Yesterday=$(date -d"yesterday" +%Y-%m-%d)

    #重命名日志文件
    mv ${Logs_Path}/access.log ${Logs_Path}/access_${Yesterday}.log

    #给nginx 进程发送指令,重新打开日志文件
    kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

PS: kill 命令必须要有,如果 nginx 没有重新打开日志文件,则不会向新的文件写入日志,还会继续向原来的日志文件写入。

contab 设置:

contab -e

0 0 * * * /bin/bash /usr/local/nginx/sbin/cut_nginx_log.sh

PS:具体周期可自行调整 脚本中的 date 命令和 crontab,比如,两天,一周,一个月等

猜您喜欢