MongoDB,日志无法进行日志轮换。

3

我的服务器上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但没有成功)。

如何解决这个问题?


http://docs.mongodb.org/manual/tutorial/rotate-log-files/ - Markus W Mahlberg
1个回答

1

我不是MongoDB专家,但是:

  1. You should be following the official documentation https://docs.mongodb.org/v2.6/tutorial/rotate-log-files/
  2. If you are going to use a logrotate config file, as you indicated, then you need a postrotate lint to your config (failure to do so is why mongodb continues to log to the log.1 file)

    postrotate
        kill -SIGUSR1 `cat /var/run/mongodb.pid` >/dev/null 2>&1 || true
    

我已确认此选项也适用于Mongo 3.2。 - DrStrangepork
我正在使用Mongodb3.2.1版本。我已经在mongodb配置文件中启用了带有重命名选项的logrotate。这种配置会产生什么样的输出?logrotate是基于文件大小还是日期? - Soorya Prakash
根据您发布的logrotate配置,轮换将基于日期(每天)。 - DrStrangepork

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接