MongoDB,日志无法logrotate

时间:2015-06-18 03:27:39

标签: mongodb logging logrotate

我的服务器上的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的日志文件。 logrotate刚出现一个奇怪的问题。 我检查日志文件:

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 config 文件中可以看出,MongoDB应该登录到logpath:

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守护程序,日志路径将正确(写入正确的日志文件)。那天,.log文件不为空,然后它将成功旋转到.log.1文件。但是在日志轮换之后会再次发生同样的问题,即MongoDB之后会记录到 .log.1 文件。循环来到这里。

logrotate config 文件在此处给出:

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,但没有运气)。

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我不是mongo专家,但是:

  1. 您应该遵循官方文档https://docs.mongodb.org/v2.6/tutorial/rotate-log-files/
  2. 如果您打算使用logrotate配置文件,如您所示,那么您的配置需要postrotate lint(未能这样做是为什么mongodb会继续登录 log.1 文件)

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

答案 1 :(得分:0)

您需要修改logrorate配置,如下所示。这对我有用

ubuntu@koala:/var/log/mongodb$ vim /etc/logrotate.d/mongodb
/var/log/mongodb/*.log {
    daily
    rotate 5
    compress
    dateext
    missingok
    notifempty
    sharedscripts
    postrotate
        /usr/bin/killall -SIGUSR1 mongod
    endscript
}

然后

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

然后重启mongod服务和连接到它的另一个节点应用程序(如果有的话)

sudo service mongod restart

sudo pm2 restart all //if your running pm2 on background, otherwise not needed