logrotate日志分割
https://www.cnblogs.com/dadonggg/p/8649706.html
一. 以docker运行的mongo日志为例
/etc/logrotate.d中编写mongo文件如下, 实际执行时不能写注释内容
/mnt/elements/log/mongodb/mongod.log { su root docker #因为mongod.log上级目录mongodb权限为777,这里需要指定mongod.log的所属用户 daily #指定转储周期为每天 rotate 15 #保留15个的文件数 create dateext #使用当期日期作为命名格式 missingok #如果日志丢失,不报错继续滚动下一个日志 notifempty #当日志文件为空时,不进行轮转 }
如果等不及cron自动执行日志轮转,想手动强制切割日志,需要加-f参数;不过正式执行前最好通过Debug选项来验证一下(-d参数),这对调试也很重要
# /usr/sbin/logrotate -f /etc/logrotate.d/mongo
# /usr/sbin/logrotate -d -f /etc/logrotate.d/mongo
mongo经测试不能使用这种方式,虽然生产了新的mongo日志文件,但是不会自动向里面写内容,需要用下面定时任务的方式
00 00 * * * /usr/local/bin/mongo --eval "new Mongo('localhost').getDB('admin').runCommand({logRotate:1});"
参考:https://blog.csdn.net/qq_31183727/article/details/90236112
二. docker中nginx日志分割
/etc/logrotate.d/nginx内容如下
/mnt/elements/log/nginx/access.log { su root root daily rotate 7 create 0644 root root dateext missingok notifempty sharedscripts postrotate docker exec elements_nginx_1 bash -c "if [ -f /run/nginx.pid ]; then kill -USR1 `docker exec elements_nginx_1 cat /run/nginx.pid`; echo 日志打包完毕; fi" endscript }
这种写法生成的新日志文件所属用户可能为systemd-resolve
每日轮询默认是在每天早上6:25执行的
root@ip-10-0-0-89:/etc# cat /etc/crontab SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
https://www.cnblogs.com/276815076/p/7053640.html
如果想自定义轮询时间 crontab -e中写入
0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx -fv >/tmp/logro.log 2>&1
kill -USR1的含义不是终止nginx的进程,而是传递给它信号重新生成日志
kill -USR1 $(/bin/cat /var/run/nginx.pid)
另外一种写法如下,参考:https://www.cnblogs.com/zhangeamon/p/7092702.html docker inspect -f '{{ .State.Pid }}' nginx | xargs kill -USR1 https://www.it610.com/article/1290705252365967360.htm https://blog.csdn.net/wu__peng/article/details/90754671
三. docker中traefik的日志轮询
经测试发现,好像不写create后面的文件归属,以及su root root后,生成的新文件属性就可以为root:root。
cat /etc/logrotate.d/traefik
/data/elements/logs/traefik/access.log { daily #指定转储周期为每天 rotate 10 #转储次数,超过将会删除最老的那一个 create dateext #使用当前日期作为命名格式 missingok #忽略错误
#size 10G #size选项将忽略每日,每周,每月时间选项,看需要是否要写 notifempty #如果日志文件为空,不执行切割 sharedscripts #只为整个日志组运行一次的脚本 postrotate #postrotate/endscript在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行 docker inspect -f '{{ .State.Pid }}' elements_traefik_1 | xargs kill -USR1 endscript
}
- weekly 指定转储周期为每周
- monthly 指定转储周期为每月
- compress 通过gzip 压缩转储旧的日志
- delaycompress 当前转储的日志文件到下一次转储时才压缩
- prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
- postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
- size size当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).
/usr/sbin/logrotate -d -f /etc/logrotate.d/traefik测试下,没问题的话写入定时任务
0 1 * * * /usr/sbin/logrotate /etc/logrotate.d/traefik -fv >/tmp/logro-traefik.log 2>&1
traefik日志轮询方法2
这种方法生成的新日志文件,用户所属都是root:root, 可以尝试比较下
/mnt/elements/logs/traefik/access.log { daily size=300M rotate 10 copytruncate missingok notifempty compress delaycompress dateext }
- copytruncate。在创建副本后在原地截断原始日志文件,而不是移走旧日志文件并(可选)创建新日志文件。当程序无法关闭其日志文件并且可能继续写入到旧日志文件时,请使用此参数。
-
注: 从复制该文件到将其截断之间可能存在一小段时间,因此,部分日志记录数据可能会丢失。使用此选项时,create 选项将不起作用,因为旧日志文件将留在原地。