我最近配置了一个新的 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 个日志文件,其中一个文件名中包含时间戳吗?我想也许我的配置有些不同,但我看不出来。
我知道我可以通过在后旋转配置中放置一个 find /var/log/mongodb/* -empty -delete 来解决这个问题,但我宁愿根本不创建它们,而不是在创建它们后删除它们。
两台机器都使用从 mongodb.org 的 ubuntu repo 安装的相同版本的 mongodb (3.0.8)
答案1
在您的配置中,您的日志正在被轮换两次。第一次发送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
答案2
只是阻止这种情况发生的配置尚未应用:
logRotate: reopen
由于配置更新后 mongo 服务尚未重新启动。重新启动服务后,下一次轮换仅创建一个日志文件。