一. 以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

 

相关文章: