1. 程式人生 > 實用技巧 >logrotate日誌切分

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
  rotate 
1441 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