關於nginx日誌定時切割、一般有兩種方案,第一用logrotate,它是一個linux系統日誌的管理工具、它可以切割、壓縮等其他軟件的日誌文件軟件;logrotate是基於crontab運行的,所以這個時間點是由crontab控制的,具體可以查詢crontab的配置文件/etc/anacrontab。第二種用shell腳本定時切割。
第一種方案:logrotate
1、安裝logrotate,我這裏是centos直接用:yum -y install logroate
2、安裝成功後、配置logrotate。/etc/logrotate.conf是logrotate的配置文件,打開該文件內容,顯示如下:
標紅處很關鍵,引入文件用的,所以我在該引入目錄下新建了一個nginx文件,內容如下:
/var/log/nginx/access/*.log { #按天切割 daily #在日誌輪循期間,任何錯誤將被忽略 missingok #一次存儲30個日誌文件。對於第31個日誌文件,時間最久的那個日誌文件將被刪除。 rotate 30 #按日期格式顯示切割後的文件名 dateext dateformat _%Y-%m-%d #不採用壓縮 #compress #delaycompress #文件爲空時不進行轉存 notifempty #以指定的權限和用書屬性,創建全新的日誌文件,同時logrotate也會重命名原始日誌文件。 create 755 web web sharedscripts postrotate kill -USR1 `ps aux | grep "nginx: master process" | grep -v grep | awk '{print $2}'` sh /var/www/webroot/nginxlogrotate/access_log_archive.sh endscript }
附日誌歸檔腳本/var/www/webroot/nginxlogrotate/access_log_archive.sh內容:
#/bin/sh lib_path="/var/log/nginx/archive/" date_path="`date +%Y`/`date +%m`/`date +%d`" path="${lib_path}${date_path}" if [ ! -d "${path}" ]; then mkdir -p "${path}" fi chmod -R 777 ${path} suffix_date=`date +%Y-%m-%d` #日誌列表 log_list=(ds img koubei shanghu static wl wx super m fc mantis) #重命名日誌文件 for i in ${log_list[@]}; do if [ -f "/var/log/nginx/access/${i}.log_${suffix_date}" ];then mv "/var/log/nginx/access/${i}.log_${suffix_date}" "${path}/${i}.log" rm -f "/var/log/nginx/access/${i}.log_${suffix_date}" fi done
配置完成這些以後,還有一個很關鍵的配置文件,/etc/anacrontab,內容如下:
標紅處我將定時任務運行的時候改爲0=23點,然後自定義cron.daily的執行時間爲每天的23:59,如此這般每天即可成功運行。
二、shell腳本
#!/bin/bash #設置日誌文件存放目錄 log_path="/usr/local/nginx/log/" #設置pid文件 pid_path="/usr/local/nginx/nginx.pid" #日誌列表 log_list=(ds img koubei shanghu static wl wx super m fc) #重命名日誌文件 for i in ${log_list[@]}; do #echo ${log_path}${i}_$(date -d "yesterday" +"%Y%m%d").log mv ${log_path}${i}.log ${log_path}${i}_$(date -d "yesterday" +"%Y%m%d").log done #向nginx主進程發信號重新打開日誌 kill -USR1 `cat ${pid_path}`
然後創建定時任務即可,定時任務可以參考我之前的文章 crontab妙用