linux服務器自動切割日志


需求

由於nginx的日志會不停地增大,所以需要我們自己去切割日志,方便管理,需要達到以下的效果:

  1. 按日期自動切割日志,最小單位是天。
  2. 當日志總量超過一定量時,自動直接清理日志,限定總量不能超過1000MB。
  3. 寫入crontab定時任務里。

分析

  1. nginx日志目錄下分別有access.log和error.log,按照日期自動切割日志則需要將每天的日志以”yyyymmdd_access/error.log”的格式保存下來,用mv重命名每一天的日志文件即可。
  2. 清理日志就簡單了,只需要判斷這個文件夾下的大小,然后將一定日期之前的日志文件清理掉就ok了。
  3. crontab任務也比較簡單,詳情可以看這里
  4. 問題的關鍵在於,用mv重命名完昨天的日志文件后,nginx還是會向這個重命名后的文件(如access_20160409.log)寫入日志,我們的目的是需要使nginx重新生成一個新的日志文件(access.log)並寫入。
  5. As we all know,linux系統下一切都是文件,所以每一個進程都有其文件描述符,而nginx進程將其自己的文件描述符寫入了nginx.pid中,我們需要告訴nginx,讓其重新打開一個新的日志文件(日志文件的配置詳情可看這里,簡單說就是讓日志記錄什么內容。)於是我們需要這條指令:

    kill -USR1 `cat ${pid_path}`

    這條指令的意思是:首先cat到nginx的pid,是一個整數,然后將信號USR1發送給這個進程,nginx進程收到這個信號后,會根據配置重新打開一個新的日志文件,並將日志寫入。

實現

腳本cut_nginx_log.sh:

#!/bin/bash
log_path=/path/to/nginx/
pid_path=/path/to/nginx.pid

#清理掉指定日期前的日志
DAYS=30

#生成昨天的日志文件
mv ${log_path}access.log ${log_path}access_$(date -d "yesterday" +"%Y%m%d").log
mv ${log_path}error.log ${log_path}error_$(date -d "yesterday" +"%Y%m%d").log

kill -USR1 `cat ${pid_path}`

#文件夾大小
size=`du -b /path/to/nginx/ | awk '{print int($1/1024/1024)}'`

if [size -gt 1000];then
    find ${logs_path} -name "access_*" -type f -mtime +$DAYS -exec rm {} \;
    find ${logs_path} -name "error_*" -type f -mtime +$DAYS -exec rm {} \;
fi

添加至crontab: 
(每天零點自動執行)

crontab -e
0 0 * * * /path/to/script

至此就解決了自動切割並清理日志的功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM