一. 以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 }
每日轮询默认是在每天早上6:25执行的
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
kill -USR1的含义:
1)nginx 的主进程收到USR1信号,会重新打开日志文件(以nginx配置文件中的日志名称命名,就是配置文件中access_log项所设置的值,如果文件不存在,会自动创建一个新的文件xxx.log)。
2)然后把日志文件的拥有者改为“工作进程(worker进程)”,目的是让worker进程就具备了对日志文件的读写权限(master和worker通常以不同用户运行,所以需要改变拥有者)
3)nginx主进程会关闭重名的日志文件(也就是刚才使用mv命令重命名成xxx.log-$date.log的文件),并通知工作进程使用新打开的日志文件(刚才主进程打开的文件xxx.log)。具体实现上更细化点就是,主进程把USR1信号发给worker,worker接到这个信号后,会重新打开日志文件(也就是配置文件中约定的xxx.log)
另外一种写法如下,参考: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