我的服务器上MongoDB的版本是v2.6.3,并且mongod正在运行:
ubuntu@koala:/var/log/mongodb$ ps -ef | grep mongo
root 7434 1 17 Jun16 ? 06:57:26 mongod -f /etc/mongodb-onepiece.conf --fork
我正在使用logrotate来每天旋转MongoDB的日志文件。最近遇到了一个奇怪的问题。我检查了日志文件:
ubuntu@koala:/var/log/mongodb$ ls -lth | grep mongodb
-rw-r--r-- 1 ubuntu ubuntu 1.9G Jun 18 10:23 mongodb-onepiece.log.1
-rw-r--r-- 1 ubuntu ubuntu 0 Jun 17 07:35 mongodb-onepiece.log
-rw-r--r-- 1 ubuntu ubuntu 838M Jun 15 07:35 mongodb-onepiece.log.3.gz
-rw-r--r-- 1 ubuntu ubuntu 22 Jun 14 20:52 mongodb-onepiece.log.2.gz
-rw-r--r-- 1 ubuntu ubuntu 1.1G Jun 4 17:10 mongodb-onepiece.log.4.gz
-rw-r--r-- 1 ubuntu ubuntu 53M May 29 19:14 mongodb-onepiece.log.5.gz
最新的日志文件是.log.1而不是.log。当我使用tail -fn查看log.1文件时,我可以看到日志仍在追加,并且它正在增长。
ubuntu@koala:/var/log/mongodb$ tail -fn 2 mongodb-onepiece.log.1
2015-06-18T10:36:50.163+0800 [initandlisten] connection accepted from 192.168.1.52:50278 #2507 (49 connections now open)
2015-06-18T10:36:50.163+0800 [conn2503] command koala.$cmd command: isMaster { ismaster: 1 } keyUpdates:0 numYields:0 reslen:178 0ms
这意味着MongoDB正在记录到错误的文件中。从mongod配置文件可以看出,MongoDB应该记录到日志路径:
ubuntu@koala:/var/log/mongodb$ vim /etc/mongodb-onepiece.conf
dbpath=/var/lib/mongodb-onepiece
logpath=/var/log/mongodb/mongodb-onepiece.log
logappend=true
bind_ip = 192.168.1.*
port = 47017
fork=true
journal=true
master = true
从上面的内容可以看出,我认为问题不在于logrotate配置,而是MongoDB写入了错误的文件。每天当logrotate启动时,它只检查.log文件并发现它是空的,然后就会停止旋转日志。
如果我重新启动mongod守护进程,logpath将在一段时间内是正确的(写入正确的日志文件)。对于那一天,.log文件不为空,然后成功地旋转到.log.1文件。但是在日志轮换之后,同样的问题会再次发生,即MongoDB将记录到.log.1文件中。循环就这样开始了。 logrotate配置文件如下:
ubuntu@koala:/var/log/mongodb$ vim /etc/logrotate.d/mongodb
/var/log/mongodb/*.log {
daily
rotate 52
missingok
copytruncate
notifempty
compress
delaycompress
}
相同的logrotate配置在另一个安装了MongoDB v2.6.5的服务器上能够很好地处理其他MongoDB日志,我认为这里postrotate不是关键(我也尝试过postrotate但没有成功)。
如何解决这个问题?