Mongo 文档说,我可以:
我希望操作系统的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 }
笔记:
kill是一个Bash内build的,但是logrotate在/bin/sh下运行 – 它不能识别RedHat 6.5上的SIGUSR1 compress但它应该是一个直接的补充 请注意,在3.0及更高版本中,不需要简单地杀死数据库守护进程来旋转日志。 请参阅这里的文档: