Mongodb – 正确的方式来旋转日志

Mongo 文档说,我可以:

  1. 使用-SIGUSR1信号,并获得旧的日志重命名和电stream切换
  2. 使用来自操作系统的logrotate

我希望操作系统的logrotate能够压缩旧文件并删除最老的文件,但是除了发送SIGUSR1之外,看不出有什么办法告诉mongod进程切换当前日志。

所以我写了

/var/log/mongodb/*.log { daily rotate 5 compress dateext missingok notifempty sharedscripts postrotate /usr/bin/killall -SIGUSR1 mongod /usr/bin/killall -SIGUSR1 mongos endscript } 

到/etc/logrotate.d/mongo。

现在,从logrotate和空日志文件(如mongodb.log.2013-09-18T23-49-44获取名为logfiles作为SIGUSR1切换的痕迹。 如何摆脱后者?

copytruncate对于logrotation来说工作得非常好。

一个类似于这个configuration应该为你做的工作:

 /var/log/mongodb/*.log { daily missingok rotate 5 compress dateext delaycompress copytruncate notifempty } 

如果您在使用logrotate将日志文件移出之后,将SIGUSR1发送给mongod,服务器就会崩溃。

以下configuration对于我testing过的版本是安全的 – 在Ubuntu 12.04上2.6.6 – 以前的示例崩溃了服务器。 把它放到/etc/logrotate.d/mongod:

 /var/log/mongodb/mongodb.log { weekly missingok rotate 4 compress notifempty create postrotate /usr/bin/pkill -USR1 mongod rm /var/log/mongodb/mongodb.log.????-??-??T??-??-?? endscript } 

请参阅: https : //jira.mongodb.org/browse/SERVER-11087了解更多详细信息,以及我在上面使用的Akshay Kumar的build议(使用create而不是nocreate和cp / dev / null作为日志文件)。

在以后的版本中,应该有一个logRotate选项,可以用来重新打开该文件 – 不重命名 – 这将解决重命名问题 – 但它不适用于我的版本(它不受支持)。

参见: https : //github.com/mongodb/mongo/commit/616461d294bd9f5054ca38b302b6fc5d70fde20c

我已经testing过了

 logrotate -v -f /etc/logrotate.d/mongod 

由于mongodb 3.0,你可以用logRotate参数改变mongodb的行为,在/etc/mongod.conf

 systemLog: logAppend: true logRotate: reopen 

另请参阅Mongo手册 。

那么你可以使用这个logrotateconfiguration:

 /var/log/mongodb/*.log { daily rotate 30 size 50M compress dateext missingok notifempty sharedscripts postrotate /bin/kill -SIGUSR1 `cat /var/lib/mongodb/mongod.lock 2> /dev/null` 2> /dev/null || true endscript } 

以下为我工作:

 /var/log/mongo/mongod.log { missingok rotate 3 size 100M nodateext postrotate /usr/bin/kill -USR1 $(cat /var/run/mongod.pid) rm -f /var/log/mongo/mongod.log.[0-9][0-9][0-9][0-9]-* endscript } 

笔记:

  • 在RedHat 6.5上testing
  • 我能得到一个工作解决scheme的唯一方法是删除Mongo生成的空白日志文件
  • locking文件的位置取决于MongoDB的安装方式
  • kill是一个Bash内build的,但是logrotate在/bin/sh下运行 – 它不能识别RedHat 6.5上的SIGUSR1
  • 我没有testing过compress但它应该是一个直接的补充

请注意,在3.0及更高版本中,不需要简单地杀死数据库守护进程来旋转日志。 请参阅这里的文档:

https://docs.mongodb.com/manual/tutorial/rotate-log-files/