Mongodb

Mongodb 日誌輪換每次執行時都會創建一個額外的空日誌文件

  • January 21, 2016

我最近配置了一個新的 mongodb 仲裁器,並用它來測試一些新的 mongo 配置,使用 mongo 3 配置語法,同時我在伺服器上測試了日誌輪換。這很好用:

$ cat /etc/mongo.conf

storage:
 dbPath: "/srv/mongodb"
 directoryPerDB: true

#where to log
systemLog:
 destination: file
 path: "/var/log/mongodb/mongodb.log"
 logAppend: true
 logRotate: reopen

# in replica set configuration, specify the name of the replica set
replication:
 replSetName: "dev"

net:
 http:
   enabled: true
   RESTInterfaceEnabled: true

日誌輪換配置:

cat /etc/logrotate.d/mongodb

/var/log/mongodb/*.log {
   daily
   rotate 7
   compress
   dateext
   missingok
   notifempty
   sharedscripts
   copytruncate
   postrotate
       /bin/kill -SIGUSR1 `cat /var/run/mongodb.pid 2> /dev/null` 2> /dev/null || true
   endscript
}

日誌文件:

-rw-r--r--  1 mongodb mongodb 230277 Jan 18 09:28 mongodb.log
-rw-r--r--  1 mongodb mongodb 353041 Jan 13 06:38 mongodb.log-20160113.gz
-rw-r--r--  1 mongodb mongodb 249142 Jan 14 06:34 mongodb.log-20160114.gz
-rw-r--r--  1 mongodb mongodb 238532 Jan 15 06:50 mongodb.log-20160115.gz
-rw-r--r--  1 mongodb mongodb 201815 Jan 16 06:47 mongodb.log-20160116.gz
-rw-r--r--  1 mongodb mongodb 205026 Jan 17 06:26 mongodb.log-20160117.gz
-rw-r--r--  1 mongodb mongodb 211581 Jan 18 06:51 mongodb.log-20160118.gz

由於這很好用,我在現有的數據庫節點之一上嘗試了相同的配置,使用以下配置:

cat /etc/mongod.conf

storage:
 dbPath: "/srv/mongodb"
 directoryPerDB: true

#where to log
systemLog:
 destination: file
 path: "/var/log/mongodb/mongodb.log"
 logAppend: true
 logRotate: reopen

# in replica set configuration, specify the name of the replica set
replication:
 replSetName: "dev"

net:
 http:
   enabled: true
   RESTInterfaceEnabled: true

日誌輪換:

cat /etc/logrotate.d/mongodb

/var/log/mongodb/*.log {
   daily
   rotate 7
   compress
   dateext
   missingok
   notifempty
   sharedscripts
   copytruncate
   postrotate
       /bin/kill -SIGUSR1 `cat /var/run/mongodb.pid 2> /dev/null` 2> /dev/null || true
   endscript
}

給我這些日誌文件:

-rw-r--r--  1 mongodb mongodb   224461 Jan 18 09:19 mongodb.log
-rw-r--r--  1 mongodb mongodb 18081598 Jan 16 06:43 mongodb.log-20160116.gz
-rw-r--r--  1 mongodb mongodb        0 Jan 16 06:43 mongodb.log.2016-01-16T06-43-30
-rw-r--r--  1 mongodb mongodb   212828 Jan 17 06:37 mongodb.log-20160117.gz
-rw-r--r--  1 mongodb mongodb        0 Jan 17 06:37 mongodb.log.2016-01-17T06-37-37
-rw-r--r--  1 mongodb mongodb   212639 Jan 18 06:49 mongodb.log-20160118.gz
-rw-r--r--  1 mongodb mongodb        0 Jan 18 06:49 mongodb.log.2016-01-18T06-49-22

誰能解釋為什麼我每天都會收到 2 個日誌文件,其中一個帶有時間戳作為文件名的一部分?我想也許我有一些配置差異,但我看不到。

我知道我可以通過在我的 post rotate 配置中放置一個 find /var/log/mongodb/* -empty -delete 來解決它,但我寧願根本不創建它們,也不願在創建它們後刪除它們。

兩台機器都使用從 mongodb.org 的 ubuntu 儲存庫安裝的相同版本的 mongodb (3.0.8)

只是沒有應用阻止這種情況發生的配置:

 logRotate: reopen

由於配置更新後 mongo 服務尚未重新啟動。重新啟動服務後,下一次輪換只創建了一個日誌文件。

在您的配置中,您的日誌被輪換兩次。第一次發送SIGUSR1到 mongo 實例,第二次通過logrotate. 因此logrotate旋轉由 mongo 剛剛創建的空日誌。不需要logrotate輪換 mongo 日誌,因為mongodb它可以自己完成。我這樣設置輪換

[mongod@lab7-mongo-4 ~]$ crontab -l
00 00 * * * /opt/gicapods/scripts/rotate_mongo.sh

[mongod@lab7-mongo-4 ~]$ less /opt/scripts/rotate_mongo.sh
#!/bin/bash
cat `find /opt/mongo/db/ -type f -name mongod.lock |egrep -v '(config|backup)'` |xargs kill -SIGUSR1
COUNT=1
for i in `/bin/ls -t /opt/mongo/log | egrep 'mongod_lab7-mongo-[0-9]+.log.*'`; do
   if [[ $COUNT -gt 5 ]]; then
           rm -f /opt/mongo/log/$i
   fi
   let "COUNT++"
done

引用自:https://serverfault.com/questions/750434