ps: 本文记录使用logrotate对nginx日志进行切割
系统版本为: CentOS7.6
nginx为编译安装默认不会生成/etc/logrotate.d/nginx 文件

命令说明

logrotate命令 用于对系统日志进行轮转、压缩和删除,也可以将日志发送到指定邮箱。使用logrotate指令,可让你轻松管理系统所产生的记录文件。每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。您必须自行编辑,指定配置文件,预设的配置文件存放在/etc/logrotate.conf文件中,而/etc/logrotate.d/是用于存储其他配置文件的目录。该目录里的所有文件都会被主动的读入 /etc/logrotate.conf中执行。

相比其他日志切割软件来看,使用 logrotate 有以下优点:
logrotate 是Linux操作系统上自带的一款开源的日志切割软件,因此你无需安装
logrotate 自身已经集成进操作系统的定时任务中,因此你无需再配置定时任务
logrotate 自身支持日志压缩

语法选项

logrotate(选项)(参数)

常用参数:
–help 在线帮助
-d 详细显示指令执行过程,便于排错或了解程序执行的情况
-f 强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然
-s 使用指定的状态文件
-v 显示指令执行过程
-usage 显示指令基本用法

logrotate 选项说明

compress                 #通过gzip 压缩转储以后的日志
nocompress               #不做gzip压缩处理
copytruncate             #用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会存在丢失部分日志数据的风险。
nocopytruncate #备份日志文件不过不截断
create mode owner group  #轮转时指定创建新文件的属性,如create 0777 nobody nobody
nocreate                 #不建立新的日志文件
delaycompress            #和compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress          #覆盖 delaycompress 选项,转储同时压缩
missingok                #如果日志丢失,不报错继续滚动下一个日志(忽略错误)
errors address           #专储时的错误信息发送到指定的Email 地址
ifempty                  #即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
notifempty               #当日志文件为空时,不进行轮转
mail address             #把转储的日志文件发送到指定的E-mail 地址
nomail                   #转储时不发送日志文件
olddir directory         #转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir                 #转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts            #运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
prerotate/endscript      #在转储以前需要执行的命令可以放入这对命令,这两个关键字必须单独成行,例如修改文件的属性等动作;
postrotate/endscript     #在转储以后需要执行的命令可以放入这对命令,这两个关键字必须单独成行,例如重新启动 (kill -HUP) 某个服务
daily                    #指定转储周期为每天
weekly                   #指定转储周期为每周
monthly                  #指定转储周期为每月
rotate 	                 #指定日志文件删除之前转储的次数,0 指没有备份,7指保留7 个备份第8个 文件备份时删除最早一个
dateext                  #使用当期日期作为命名格式
dateformat .%s           #配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数
size(或minsize) log-size #当日志文件到达指定的大小时才转储

日志切割

需求:
按天切割
保留最近30天的日志文件
日志如果为空将不进行切割和压缩
切割中遇到日志错误忽略
以gzip压缩
不要将刚切割后的日志文件放到下个循环中进行压缩
切割后的日志文件添加扩展名
扩展名为年月日
扩展名的年月日为昨天的日期
备份日志保存到/www/wwwlogs/bakcup,目录中
在切割后执行 postrotate/endscript之间的命令,此处为热重启nginx

[root@nginx01 ~]#:  vim /etc/logrotate.d/nginx
/www/wwwlogs/nginx/*.log {
        daily
        missingok
        rotate 30
        notifempty
        compress
        nodelaycompress
        copytruncate
        dateext
        dateformat -%Y-%m-%d
        dateyesterday
        olddir /www/wwwlogs/backup
        postrotate
        if [ -f /www/server/nginx/logs/nginx.pid ];then
                kill -USR1 $(cat /www/server/nginx/logs/nginx.pid)
        fi
        endscript
}

ps: 对于不在同一目录下的多个目录日志切割,在开始指定切割日志处加上想要切割的其他日志文件即可 用空格分开

可以使用系统默认的logrotate定时任务进行切割,也可以删了默认规则,用crontab定时任务自行定义。
如:

#删除默认规则
rm -rf /etc/cron.daily/logrotate
#使用crontab -e新建crontab规则:
[root@nginx01 ~]# crontab -e
00 01 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx
#这样每天凌晨0点1分就会执行nginx日志切割。注意确认logrotate命令的位置。