nginx为例的日志切割处理方式——筑梦之路

#脚本一
#!/bin/bash
year=`date +%Y`
month=`date +%m`
day=`date +%d`
logs_backup_path="/usr/local/nginx/logs_backup/$year$month"               #日志存储路径

logs_path="/usr/local/nginx/logs/"                                        #要切割的日志路径
logs_access="access"                                                      #要切割的日志
logs_error="error"
pid_path="/usr/local/nginx/logs/nginx.pid"                                 #nginx的pid

[ -d $logs_backup_path ]||mkdir -p $logs_backup_path
rq=`date +%Y%m%d`
#mv ${logs_path}${logs_access}.log ${logs_backup_path}/${logs_access}_${rq}.log
mv ${logs_path}${logs_error}.log ${logs_backup_path}/${logs_error}_${rq}.log
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

#脚本二
#!/bin/bash
#nginx日志切割脚本

d=`date -d "-1 day" +%Y%m%d `
logdir="/data/logs/nginx/"
nginx_pid="/usr/local/nginx/logs/nginx.pid"
cd $logdir
for log in `ls *.log`
do
	mv $log $d-$log
done
/bin/kill -HUP `cat $nginx_pid`

#查看脚本执行过程
sh -x nginx_logrotate.sh

#定时任务
0 0 * * * /opt/nginx_logrotate.sh
find /data/logs/nginx/ -name *.log-* -type f -mtime +30 | xargs rm -rf


利用logrotate管理日志

(1)默认centos系统安装自带logrotate,软件包信息说明;

# rpm -ql  logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf  # 主配置文件
/etc/logrotate.d   # 配置目录
(2)使用Logrorate切割日志

复制代码
# vim /etc/logrotate.d/nginx 
/var/log/nginx/*.log     #此处为nginx存储日志的地方;
 {
    daily                    #指定转储周期为每天
    rotate 30                #转储次数,超过将会删除最老的那一个
    missingok                #如果日志文件丢失,不要显示错误
    compress                 #通过gzip 压缩转储以后的日志 转储之后压缩.tar.gz
    delaycompress            #当前转储的日志文件到下一次转储时才压缩
    notifempty               #当日志文件为空时,不进行轮转
    sharedscripts           //整个日志组运行一次的脚本
    postrotate               #执行的指令
      if [ -f /var/run/nginx/nginx.pid ]; then
          kill -USR1 `cat /var/run/nginx/nginx.pid`  ##切割日志完成后通知nginx重新打开日志文件,不终止nginx
      fi
endscript                   #PID路径根据实际路径填写;
}
复制代码
(3)保存好配置文件后,测试效果:

# logrotate -vf /etc/logrotate.d/nginx 
access.log  access.log.1  error.log  error.log.1
(4)定时任务执行

#crontab –e
0 0 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/nginx #每天凌晨00:00自动执行日志切割任务;



其他:

/data/weblogs/*.log {
    nocompress
    daily
    copytruncate
    create
    notifempty
    rotate 7
    olddir /data/weblogs/old_log
    missingok
    dateext
    postrotate
        /bin/kill -HUP `cat /var/run/nginx.pid 2> /dev/null` 2> /dev/null || true
    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             在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript            在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily                           指定转储周期为每天
weekly                          指定转储周期为每周
monthly                         指定转储周期为每月
rotate count                    指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
tabootext [+] list 让logrotate   不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~ 
size size                       当日志文件到达指定的大小时才转储,bytes(缺省)及KB(sizek)或MB(sizem)
sharedscripts                   整个日志组运行一次的脚本
注意:
cat /etc/logrotate.conf
# 底下的设定是 "logrotate 的默认值" ,如果別的文件设定了其他的值,
# 就会以其它文件的设定为主
weekly          //默认每一周执行一次rotate轮转工作
rotate 4       //保留多少个日志文件(轮转几次).默认保留四个.就是指定日志文件删除之前轮转的次数,0 指没有备份
create         //自动创建新的日志文件,新的日志文件具有和原来的文件相同的权限;因为日志被改名,因此要创建一个新的来继续存储之前的日志
dateext       //这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如xxx.log-20131216这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式
compress      //是否通过gzip压缩转储以后的日志文件,如xxx.log-20131216.gz ;如果不需要压缩,注释掉就行

include /etc/logrotate.d
# 将 /etc/logrotate.d/ 目录中的所有文件都加载进来

/var/log/wtmp {                 //仅针对 /var/log/wtmp 所设定的参数
monthly                    //每月一次切割,取代默认的一周
minsize 1M              //文件大小超过 1M 后才会切割
create 0664 root utmp            //指定新建的日志文件权限以及所属用户和组
rotate 1                    //只保留一个日志.
}
# 这个 wtmp 可记录用户登录系统及系统重启的时间
# 因为有 minsize 的参数,因此不见得每个月一定会执行一次喔.要看文件大小。
#############
一个实例

------------------------------------------
vim /etc/logrotate.d/nginx
/data/nginx_logs/*.access_log         
{
nocompress                                    
daily                                   
copytruncate                                   
create                               
ifempty                                    
olddir /data/nginx_logs/days            
rotate 0                                         
}
-----------------------------------------------------
vim /usr/local/sbin/logrotate-nginx.sh
#!/bin/bash
#创建转储日志压缩存放目录
mkdir -p /data/nginx_logs/days
#手工对nginx日志进行切割转换
/usr/sbin/logrotate -vf /etc/logrotate.d/nginx
#当前时间
time=$(date -d "yesterday" +"%Y-%m-%d")
#进入转储日志存放目录
cd /data/nginx_logs/days
#对目录中的转储日志文件的文件名进行统一转换
for i in $(ls ./ | grep "^\(.*\)\.[[:digit:]]$")
do
mv ${i} ./$(echo ${i}|sed -n 's/^\(.*\)\.\([[:digit:]]\)$/\1/p')-$(echo $time)
done
#对转储的日志文件进行压缩存放,并删除原有转储的日志文件,只保存压缩后的日志文件。以节约存储空间
for i in $(ls ./ | grep "^\(.*\)\-\([[:digit:]-]\+\)$")
do
tar jcvf ${i}.bz2 ./${i}
rm -rf ./${i}
done
#只保留最近7天的压缩转储日志文件
find /data/nginx_logs/days/* -name "*.bz2" -mtime 7 -type f -exec rm -rf {} \;

-----------------------------------------------------

#logrotate
0 0 * * * /bin/bash -x /usr/local/sbin/logrotate-nginx.sh > /dev/null 2>&1 

logrotate

你可能感兴趣的:(linux系统运维,nginx,linux,运维)