例子一、按日期切割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 . -ctime +7 -name "*20[1-9][3-9]*" | xargs rm -f
exit 0
將這個指令碼添加到計劃任務,每天執行一次即可:
1 0 * * * /usr/local/script/cut_del_logs.sh
此方法,網上一搜一大把,因此本文僅作為個人工作記錄,並非教程,隨便看看就行,別太在意。
例子2、按天分類儲存並刪除超過7天的日誌
指令碼內容:
#!/bin/bash
# a nginx access log segmentation shell script
cd /data/wslogs
log_dir="/data/wslogs"
time=`date +%Y%m%d`
nginx_dir="/usr/local/webserver/nginx"
#日誌分割,按天分類
website=`ls $log_dir/access* | xargs -n 1 | cut -f 2 -d "."`
for i in $website
do
mkdir -p $log_dir/backup/$time/$i
mv $log_dir/access.$i.log $log_dir/backup/$time/$i/$time.log
done
$nginx_dir/sbin/nginx -s reload
#刪除所有超過7天日誌。
if [ "`date +%a`" = "Sun" ]; then
all_list=`ls $log_dir/backup | xargs -n 1`
for del in $all_list
do
let results=$time-$del
if [ $results -gt 7 ]; then
rm -fr $log_dir/backup/$del
fi
done
fi
需要注意的是:因為個人需要,Nginx訪問日誌命名格式必須是access.網域名稱.log,例如:access.www_1987_com.log,網域名稱中原來的點.必須換成其他字元,比如底線_
代碼中的一些位置參數可以根據自己需要修改,修改/etc/crontab檔案,加入00 00 * * * root /data/logcron.sh,每天零點執行。