nginx 日志切割

 

一、logrotate日志切割技术

logrotate 是nginx 

1、安装logrotate

yum install logrotate cron

2、每天一次,定时更新。如需按小时,或者按分钟,可以注释掉。

cat /etc/cron.daily/logrotate
#!/bin/sh

#/usr/sbin/logrotate /etc/logrotate.conf
#EXITVALUE=$?
#if [ $EXITVALUE != 0 ]; then
# /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
#fi
#exit 0

3、定时更新脚本

3.1、配置文件

logrotate.conf是主要的参数文件,至于logrotate.d是一个目录,该目录里面的所有文件都会被logrotate.conf文件主动读入,若logrotate.d/里的文件没有指定详细设置,则以/etc/logrotate.conf这个文件里配置的默认值为准。

/etc/logrotate.conf

sed -r '/^$|^#/d' /etc/logrotate.conf
weekly
rotate 100
create
dateext
dateformat
include /etc/logrotate.d
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 500M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}

 

 

cat /etc/logrotate.d/nginx
/data/service/nginx/log/*.log {
daily
rotate 4320
missingok
dateext
dateformat -%Y%m%d.%s

#定义时间格式,加时间戳

compress
notifempty
sharedscripts
postrotate
[ -e /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}

4、脚本

cat /data/script/logrotate-nginx.sh
#!/bin/bash
#创建转储日志压缩存放目录
mkdir -p /data/service/nginx/log_backup
#手工对日志进行切割
/usr/sbin/logrotate -vf /etc/logrotate.d/nginx
#当前时间
#time=$(date -d "yesterday" +"%Y-%m-%d")
time=$"(date -d +"%Y%m%d%H%M")"
#进入转储日志存放目录
cd /data/service/nginx/log
#对目录中的转储日志文件的文件名进行统一转换
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

 

5、定时任务

30 */1 * * *  /data/script/logrotate-nginx.sh  >> /tmp/logrotate-nginx.log 2>&1

 

6、logrotate参数

 

参数描述
daily 每天轮替一次
weekly 每周轮替一次
monthly 每月轮替一次
yearly 每年轮替一次
rotate 保留几个轮替日志文件
ifempty 不论日志是否空,都进行轮替
notifempty 若日志为空,则不进行轮替
create 旧日志文件轮替后创建新的日志文件
size 日志达到多少后进行rotate
minsize 文件容量一定要超过多少后才进行rotate
nocompress 轮替但不进行压缩
compress 压缩轮替文件
dateext 轮替旧日志文件时,文件名添加-%Y %m %d形式日期,可用dateformat选项扩展配置。
nodateext 旧日志文件不使用dateext扩展名,后面序数自增如"*.log.1"
dateformat 只允许%Y %m %d和%s指定符。注意:系统时钟需要设置到2001-09-09之后,%s才可以正确工作
sharedscripts 作用域下文件存在至少有一个满足轮替条件的时候,执行一次prerotate脚本和postrotate脚本。
prerotate/endscript 在轮替之前执行之间的命令,prerotate与endscript成对出现。
postrotate/endscript 在轮替之后执行之间的命令,postrotate与endscript成对出现。
olddir 将轮替的文件移至指定目录下
missingok 如果日志文件不存在,继续进行下一个操作,不报错
 
二、早起日志切割方法
 vim /data/script/cut_nginx_log.sh
#!/bin/bash
# 你的日志文件存放目录
logs_path="/data/service/nginx/log/"
# 日志文件的名字,多个需要空格隔开
logs_names=(error access pv_access)
dates=`date -d "yesterday" +"%Y%m%d%H%M"`
mkdir -p ${logs_path}$dates/
num=${#logs_names[@]}
for((i=0;i<num;i++));do
mv ${logs_path}${logs_names[i]}.log ${logs_path}$dates/${logs_names[i]}.log
done
#nginx平滑重启
kill -USR1 `cat /letv/logs/nginx/nginx.pid`           
 
结合crontab定时执行
[root@letv-backup ~]# crontab -e
#nginx日志切割
00 00 * * * cd /letv/logs;/bin/bash /letv/sh/cut_nginx_log.sh > /dev/null 2>$1
 

 

posted @ 2018-11-16 18:23  竹雅轩  阅读(110)  评论(0)    收藏  举报