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++));domv ${logs_path}${logs_names[i]}.log ${logs_path}$dates/${logs_names[i]}.logdone#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

浙公网安备 33010602011771号