Nginx 訪問日誌輪詢切割

一.概述

默認狀況下 Nginx 會把全部的訪問日誌生成到一個指定的訪問日誌文件 access.log 裏,但這樣一來,時間長了就會致使日誌個頭很大,不利於日誌的分析和處理,所以,有必要對 Nginx 日誌,按天或按小時進行切割,使其分紅不一樣的文件保存。這裏使用按天切割的方法。html

日誌切割實現的原理是將正在寫入的 access.log 日誌更名爲帶日期格式的文件,而後平滑從新加載 Nginx ,生成新的 access.log 日誌文件。python


二.shell腳本實現

1.早期用過的shell腳本(cut_nginx_log.sh)

#!/bin/bash
# This script run at 00:00

# The Nginx logs path
logs_path="/usr/local/nginx/logs/"

mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

2.老男孩shell腳本(cut_nginx_log.sh)

#!/bin/bash
Dateformat=`date +%Y%m%d`
Basedir="/usr/local/nginx"
Nginxlogdir="$Basedir/logs"
Logname="access"
[ -d $Nginxlogdir ] && cd $Nginxlogdir || exit 1
[ -f ${Logname}.log ] || exit 1
/bin/mv ${Logname}.log ${Dateformat}_${Logname}.log
$Basedir/sbin/nginx -s reload

賦權限nginx

chmod +x /usr/local/nginx/cut_nginx_log.sh

設置計劃任務,天天凌晨00:00切割nginx訪問日誌shell

cat >> /var/spool/cron/root << eof
#nginx日誌切割
00 00 * * * /bin/bash  /usr/local/nginx/cut_nginx_log.sh
eof

3.更厲害的shell腳本(log_rotate.sh)

#!/bin/bash

function rotate() {
logs_path=$1

echo Rotating Log: $1
cp ${logs_path} ${logs_path}.$(date -d "yesterday" +"%Y%m%d")
> ${logs_path}
    rm -f ${logs_path}.$(date -d "7 days ago" +"%Y%m%d")
}
 
for i in $*
do
        rotate $i
done

賦權限vim

chmod +x /usr/local/nginx/log_rotate.sh

手動執行切割:bash

find /usr/lcoa/nginx/logs/ -size +0 -name '*.log' | xargs /usr/local/nginx/log_rotate.sh

設置計劃任務天天凌晨00:00對nginx日誌進行切割,0K的日誌不進行切割:工具

cat >> /var/spool/cron/root << eof
#nginx日誌切割
30 0 * * * find /usr/lcoa/nginx/logs/ -size +0 -name '*.log' | xargs /usr/local/nginx/log_rotate.sh
eof

三.python腳本實現

python腳本以下(log_rotate.py):ui

#!/usr/bin/env python
   
import datetime,os,sys,shutil
   
log_path = '/usr/local/nginx/logs/'
log_file = 'access.log'
   
yesterday = (datetime.datetime.now() - datetime.timedelta(days = 1))
   
try:
    os.makedirs(log_path + yesterday.strftime('%Y') + os.sep + \
                yesterday.strftime('%m'))
   
except OSError,e:
    print
    print e
    sys.exit()
   
   
shutil.move(log_path + log_file,log_path \
            + yesterday.strftime('%Y') + os.sep \
            + yesterday.strftime('%m') + os.sep \
            + log_file + '_' + yesterday.strftime('%Y%m%d') + '.log')
   
   
os.popen("sudo kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`")

賦權限spa

chmod +x /usr/local/nginx/log_rotate.py

設置計劃任務,天天凌晨00:00切割nginx訪問日誌日誌

cat >> /var/spool/cron/root << eof
#nginx日誌切割
00 00 * * * /usr/bin/python  /usr/local/nginx/log_rotate.py
eof

四.使用logrotate實現

logrotate日誌管理工具

相關文章
相關標籤/搜索