脚本编程

nginx日志切割及7天前的历史日志删除脚本

Jager · 7月21日 · 2014年 7284次已读

上次写到《服务器日志备份超节省空间的思路》,压缩后磁盘占用由 93%降到了 62%,效果还是不错的!为什么不直接删除呢?其实是因为这些日志涉及到支付等重要业务,保存半年以上也算是保守的做法。

今早,又发现几例磁盘空间报警,占用率都在 90%+,关键居然是根分区!这要是日志突然暴涨,把根分区撑爆了,那就可以体验到“菊花一紧”的快感了吧?

索性利用 CRT 的全局命令把磁盘空间占用率超过 75%的服务器筛选出来,打算继续进行清理磁盘空间这个枯燥的工作。结果,发现好几台 nginx 方向代理服务器的日志居然还没做分割处理,一个 access.log 居然近 200G 大小!真是 I 服了 U

nginx日志切割及7天前的历史日志删除脚本

于是,就有了下面这个日志切割脚本,按日期切割 nginx 日志,并自动删除 7 天前的日志(日志均已同步至专用日志存储服务器,可放心删除历史日志。)

#!/bin/bash
#初始化
LOGS_PATH=/data/nginx/logs/www.domain.com
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
#按天切割日志
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${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

将这个脚本添加到计划任务,每天执行一次即可:

1 0 * * * /usr/local/script/cut_del_logs.sh

此方法,网上一搜一大把,因此本文仅作为个人工作记录,并非教程,随便看看就行,别太在意。

16 条回应
  1. 每日秀 2014-7-21 · 17:56

    哎哟我cao 一不小心就点到几个广告,罪过。罪过

    • avatar
      Jager 2014-7-21 · 18:34

  2. 81主机|81ji.com 2014-7-21 · 21:44

    200G!!!不敢想象。。。

  3. PHP二次开发 2014-7-21 · 23:05

    ⊙﹏⊙b汗,刚开始玩Linux的时候,被日志文件搞得头疼。

    • avatar
      Jager 2014-7-23 · 12:32

      日志处理是运维的一项基本工作,很枯燥的玩意。

  4. 噶里味美食网 2014-7-22 · 9:09

    尼玛,linux我一直玩不好~

  5. 夏日博客 2014-7-22 · 9:20

    居然没有用过 nginx。。日志要时刻清理才行。。要么爆满了就会拖夸服务器。

  6. 香港虚拟主机 2014-7-23 · 9:12

    不错不错,学习到了

  7. aoweisi 2015-11-23 · 9:51

    请问 Nginx 日志分析工具用什么好

  8. 大胖子 2016-4-15 · 17:26

    ftp主机 能命令编辑任务计划吗

  9. 黑色冰激凌 2017-3-7 · 16:22

    我就像一个文盲一样,看不懂shell,也不会写,好无趣。。。

  10. Ropon 2017-11-23 · 15:19

    kill -USR1
    请问这是什么意思呢 :?:

    • avatar
      Jager 2017-11-25 · 18:02

      你百度搜下不就知道了么。。留言不是更麻烦

      • Ropon 2017-11-25 · 20:21

        :arrow:
        nginx运行分master、worker进程,kill -USR1 可能是给master发一个信号,相当于临时暂停下,不影响worker进程,相当于对网站零影响;还是相当于reload的意思呢?

        • Ropon 2017-11-25 · 20:28

          kill USR1 指告诉应用程序重载配置文件相当于reload。

          • avatar
            Jager 2017-11-26 · 19:54

            你看,自己搜出来的印象深刻,比直接告诉你好多了。

  11. adoal 2021-11-30 · 17:00

    现在大多数Linux发行版服务器安装默认都装了logrotate,写一个conf就可以了,各种奇怪的rotate(内……卷?)需求都能搞定。
    其实如果是用包管理器安装的nginx,logrotate的conf都写好了的。

    • avatar
      Jager 2021-11-30 · 18:28

      咳..这都陈年老文了,14年的时候信息那么闭塞,我当时水平也就那样,估计也就只能接触到这个层次的技能了。