logrotate日誌切分
logrotate是一個日誌切分工具,十分有用,它可以自動對日誌進行截斷(或輪循)、壓縮以及刪除舊的日誌檔案。例如,你可以設定logrotate,讓/var/log/nginx日誌檔案每10天輪循,並刪除超過7天的日誌。配置完後,logrotate的運作完全自動化,不必進行任何進一步的人為干預。下面是例子
我們去編輯/etc/logrotate.d/nginx.conf
注意,如果你的/etc/logrotate.conf配置檔案中配置了include才可以使用.d下的檔案,nginx.conf是我們自己建立的檔案,裡面第一行寫的就是監控的日誌路徑
/var/log/nginx/access.log{ dateext dateformat .web daily rotate1441 copytruncate compress notifempty missingok size 1M lastaction cd /var/log/nginx/ for i in $(seq 1 10) do if [ ! -f "access.log.web.gz" ]; then sleep 3s fi done mv ./access.log.web.gz ./access.log.web.`date +%Y%m%d-%H:%M:%S`.gz if [ ! -f `ls access_[0-9]*.log &> /dev/null` ]; then gzip nginx_error_[0-9]*.log fi rm -f ./nginx_error_[0-9]*.log endscript }
常見引數如下,另外在lastaction和endscript中間可以編輯我們要執行的動作
配置引數 |
說明 |
compress |
通過gzip壓縮轉儲以後的日誌 |
nocompress |
不壓縮 |
copytruncate |
用於還在開啟中的日誌檔案,把當前日誌備份並截斷 |
nocopytruncate |
備份日誌檔案但是不截斷 |
createmode owner group |
轉儲檔案,使用指定的檔案模式建立新的日誌檔案 |
nocreate |
不建立新的日誌檔案 |
delaycompress |
和compress一起使用時,轉儲的日誌檔案到下一次轉儲時才壓縮 |
nodelaycompress |
覆蓋delaycompress選項,轉儲同時壓縮。 |
errors address |
專儲時的錯誤資訊傳送到指定的Email地址 |
ifempty |
即使是空檔案也轉儲,這個是logrotate的預設選項。 |
notifempty |
如果是空檔案的話,不轉儲 |
mailaddress |
把轉儲的日誌檔案傳送到指定的E-mail地址 |
nomail |
轉儲時不傳送日誌檔案 |
olddirdirectory |
轉儲後的日誌檔案放入指定的目錄,必須和當前日誌檔案在同一個檔案系統 |
noolddir |
轉儲後的日誌檔案和當前日誌檔案放在同一個目錄下 |
prerotate/endscript |
在轉儲以前需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行 |
daily |
指定轉儲週期為每天 |
weekly |
指定轉儲週期為每週 |
monthly |
指定轉儲週期為每月 |
rotate count |
指定日誌檔案刪除之前轉儲的次數,0指沒有備份,5指保留5個備份 |
tabooext [+] list |
讓logrotate不轉儲指定副檔名的檔案,預設的副檔名是:.rpm-orig, .rpmsave, v,和~ |
size size |
當日志文件到達指定的大小時才轉儲,bytes(預設)及KB(sizek)或MB(sizem) |
missingok |
在日誌輪循期間,任何錯誤將被忽略,例如“檔案無法找到”之類的錯誤。 |
然後我們可以在編寫一個指令碼可以對切割出來的一個個小tar包進行整合打包上傳等操作,如下:
其中:
$1=日誌目錄
$2=備份目錄
$3=app的名字,可以隨便寫,只是為了標識作用,也可以不要$3
$4=日誌型別,因為本程式有docker和nginx兩個日誌,所以用$4的值來進行區分
$5=logrotate切割出來的小tar包要儲存的天數
$6=合併logrotate切割出來的小tar包要保留的天數
[root@VM-0-15-centos ~]# cat test.sh #!/bin/bash if [ $1 ] then logdir=$1 echo "log_addr is : $logdir " else echo "Err: 1st param log_addr is null " exit fi if [ $2 ] then bakdir=$2 echo "bakup_addr addr :$bakdir " else echo "Err:2nd param bakup_addr is null " exit fi if [ $3 ] then app_log_name=$3 echo "appname is :$app_log_name " else echo "Err: 3rd param appname is null " exit fi if [ $4 ] then logtype=$4 echo "logtype is :$logtype" else echo "Err: 4th param logtype is null " exit fi if [ $5 ] then del_before_days="+$5" echo "del_before_days is :$del_before_days" else echo "Err: 5th param del_before_days is null " exit fi if [ $6 ] then del_bak_days="+$6" echo "del_bak_days is :$del_before_days" else echo "Err: 6th param del_bak_deys is null " exit fi #echo 'chmod 755 '$1' ' #sudo chmod -R 777 $1 ip=`hostname` ret_name=${app_log_name}_${ip}_${logtype}_`date +"%Y%m%d" -d "-1 days"`.gz echo "package name :"$ret_name # 推nas盤進行清理 echo "rm file 7 days ago , rgx : "${app_log_name}_${ip}_${logtype}*.gz find $bakdir -mtime $del_bak_days -name "${app_log_name}_${ip}_${logtype}*.gz" -exec rm -rf {} \; #find $bakdir -mtime +7 -name "${app_log_name}_${ip}_${logtype}*.gz" cd $logdir if [ "$logtype"i = nginxi ] then [ -n "`ls access_[0-9]*.log 2>/dev/null `" ] && gzip -f access_[0-9]*.log && rm -f ./access_[0-9]*.log [ -n "`ls error_[0-9]*.log 2>/dev/null `" ] && gzip -f error_[0-9]*.log && rm -f ./error_[0-9]*.log echo 'package nginx log to '$ret_name #把切分的日誌打包成一個包 find ./ -mtime 1 | grep ".gz" | xargs tar -czvf $ret_name #刪除自定義天數以前的小包 find ./ -mtime $del_before_days | grep ".gz" | xargs rm -rf && echo "success delete $del_before_days gz!!" #old #[ -n "`ls ./nginx_*.gz 2>/dev/null `" ] && tar -czvf $ret_name ./nginx_*.gz --remove-files || { echo 'no nginx file to package, bye'; exit; } elif [ "$logtype"i = dockeri ] then echo 'package docker log to '$ret_name #[ -n "`ls ./*/*.gz 2>/dev/null `" ] && tar -czvf $ret_name ./*/*.gz --remove-files || { echo 'no docker file to package, bye' && exit; } find ./*/ -mtime 1 | grep ".gz" | xargs tar -czvf $ret_name find ./*/ -mtime $del_before_days | grep ".gz" | xargs rm -rf && echo "success delete $del_before_days gz!!" else echo 'err: not found log type' exit; fi # 移動到nas盤 mv -f $ret_name $bakdir echo 'mv file '$ret_name' to '$bakdir