Nginx容器挂载日志卷的日志切割: logrotate
1). 功能: 配合crontab控制启动, 按配置定义的分割时间和保留分割文件数量来控制日志生成和删除.
2). 语法: logrotate [参数] <路径/配置文件> -d, --debug 调试模式,输出调度结果,并不执行. -f, --force 强制模式,对所有相差文件进行rotate.
3). 实例:
mkdir -p /data/nginx/logs/old_log
vim /data/nginx/nginx-logrotate.conf
/data/nginx/logs/*.log {
#不压缩切割后的日志文件
nocompress
#按周来分割
weekly
#允许分割打开中的日志文件
copytruncate
#分割后的日志文件属性
create 644 root root
#空日志不处理
notifempty
#保存200个副本,即分割出来的旧日志文件数量
rotate 200
#指定分割的日志文件保存位置
olddir /data/nginx/logs/old_log
#忽略所有错误
missingok
#使用日期重命名分割后的文件
dateext
#分割后,执行的shell命令
postrotate
# 因为是容器挂载日志卷,则需要进入容器操作nginx进程,让它重新打开切割后生成的新日志文件
# kill -USR1 $(cat /var/run/nginx.pid), 获取nignx的pid值
# -USR2是指重加载nginx日志, 参考"nginx的HUB信令方式"
docker exec kg-nginx bash -c "if [ -f /var/run/nginx.pid ]; then kill -USR1 $(cat /var/run/nginx.pid); service nginx status; fi"
endscript
}
# 配置文件中常用的一些选项:
# compress:通过gzip 压缩转储旧的日志
# nocompress:不需要压缩时,用这个参数
# daily:指定转储周期为每天
# weekly:指定转储周期为每周
# monthly:指定转储周期为每月
# copytruncate:用于还在打开中的日志文件,把当前日志备份并截断
# nocopytruncate:备份日志文件但是不截断
# create mode owner group:使用指定的文件模式创建新的日志文件
# nocreate:不建立新的日志文件
# ifempty:即使是空文件也转储,这个是 logrotate 的缺省选项
# notifempty:如果是空文件的话,不转储
# rotate count:指定日志文件删除之前转储的次数,0指没有备份,7指保留7个备份
# olddir directory:转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
# noolddir:转储后的日志文件和当前日志文件放在同一个目录下
# missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误
# dateext: 使用日期作为日志轮替文件的后缀,如secure-20130605
# prerotate ... endscript:在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
# postrotate ... endscript:在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
# sharedscripts:所有的日志文件都轮转完毕后统一执行一次脚本
# size size:当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB
4). 检测配置文件语法 && 强制执行分割
logrotate -d nginx-logrotate.conf
logrotate -f nginx-logrotate.conf
5). 写入计划任务: 每天23点59分执行, 二选一即可
echo "59 23 * * * root /usr/sbin/logrotate -f /data/nginx/nginx-logrotate.conf" >>/etc/crontab