蒙戈文档我可以说:
- 使用 -SIGUSR1 信号并重命名旧日志并切换当前日志
- 从操作系统使用 logrotate
我希望操作系统的 logrotate 功能能够压缩旧文件并删除最旧的文件,但除了发送 SIGUSR1 之外,没有其他方法可以告诉 mongod 进程切换当前日志。
所以我写道
/var/log/mongodb/*.log {
daily
rotate 5
compress
dateext
missingok
notifempty
sharedscripts
postrotate
/usr/bin/killall -SIGUSR1 mongod
/usr/bin/killall -SIGUSR1 mongos
endscript
}
到 /etc/logrotate.d/mongo。
现在可以从 logrotate 中获取命名良好的日志文件,并获取空日志文件,就像mongodb.log.2013-09-18T23-49-44
SIGUSR1 切换的痕迹一样。如何摆脱后者?
答案1
copytruncate 对于 logrotation 来说效果很好。
类似于此的配置应该可以为您完成这项工作:
/var/log/mongodb/*.log {
daily
missingok
rotate 5
compress
dateext
delaycompress
copytruncate
notifempty
}
答案2
从 mongodb 3.0 开始,你可以使用 logRotate 参数更改 mongodb 的行为,在 /etc/mongod.conf 中进行更改
systemLog:
logAppend: true
logRotate: reopen
也可以看看Mongo 手册。
然后您可以使用这个 logrotate 配置:
/var/log/mongodb/*.log {
rotate 30
size 50M
compress
dateext
missingok
notifempty
sharedscripts
postrotate
/bin/kill -SIGUSR1 `cat /var/lib/mongodb/mongod.lock 2> /dev/null` 2> /dev/null || true
endscript
}
答案3
如果您在使用 logrotate 移开日志文件后向 mongod 发送 SIGUSR1,则服务器会崩溃。
以下配置对于我测试过的版本(ubuntu 12.04 上的 2.6.6)是安全的,前面的示例导致服务器崩溃。将其放入 /etc/logrotate.d/mongod:
/var/log/mongodb/mongodb.log {
weekly
missingok
rotate 4
compress
notifempty
create
postrotate
/usr/bin/pkill -USR1 mongod
rm /var/log/mongodb/mongodb.log.????-??-??T??-??-??
endscript
}
看:https://jira.mongodb.org/browse/SERVER-11087有关更多详细信息以及我在上面使用的 Akshay Kumar 的建议(使用 create 而不是 nocreate 并将 cp /dev/null 到日志文件)。
在更高版本中应该有一个 logRotate 选项,您可以使用它来重新打开文件 - 而不是重命名它 - 这将解决重命名问题 - 但它在我的版本中不起作用(它不受支持)。
看:https://github.com/mongodb/mongo/commit/616461d294bd9f5054ca38b302b6fc5d70fde20c
我已经测试过了
logrotate -v -f /etc/logrotate.d/mongod
答案4
以下对我有用:
/var/log/mongo/mongod.log {
missingok
rotate 3
size 100M
nodateext
postrotate
/usr/bin/kill -USR1 $(cat /var/run/mongod.pid)
rm -f /var/log/mongo/mongod.log.[0-9][0-9][0-9][0-9]-*
endscript
}
笔记:
- 在 RedHat 6.5 上测试
- 我能得到有效解决方案的唯一方法是删除 Mongo 生成的空日志文件
- 锁文件的位置取决于 MongoDB 的安装方式
kill
是 Bash 内置的,但 logrotate 运行在- RedHat 6.5 上/bin/sh
无法识别SIGUSR1
- 我还没有测试过,
compress
但这应该是一个简单的补充