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