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          

备份日志文件但是不截断

create mode owner group 

转储文件,使用指定的文件模式创建新的日志文件

nocreate                

不建立新的日志文件

delaycompress           

和 compress 一起使用时,转储的日志文件到下一次转储时才压缩

nodelaycompress         

覆盖 delaycompress 选项,转储同时压缩。

errors address          

专储时的错误信息发送到指定的Email 地址

ifempty                 

即使是空文件也转储,这个是 logrotate 的缺省选项。

notifempty              

如果是空文件的话,不转储

mail address             

把转储的日志文件发送到指定的E-mail 地址

nomail                  

转储时不发送日志文件

olddir directory         

转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统

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