Mongodb - 旋转日志的正确方法

And*_*tov 15 logging logrotate mongodb

Mongo文档说我可以:

  1. 使用 -SIGUSR1 信号并重命名旧日志并切换当前日志
  2. 使用 OS 的 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
}
Run Code Online (Sandbox Code Playgroud)

到 /etc/logrotate.d/mongo。

现在从 logrotate 和空日志文件中获取命名良好的日志文件,例如mongodb.log.2013-09-18T23-49-44SIGUSR1 切换的痕迹。如何摆脱后者?

小智 18

从 mongodb 3.0 开始,您可以使用 logRotate 参数更改 mongodb 的行为,在 /etc/mongod.conf 中更改

systemLog:
  logAppend: true
  logRotate: reopen
Run Code Online (Sandbox Code Playgroud)

另请参阅Mongo 手册

然后你可以使用这个 logrotate 配置:

/var/log/mongodb/*.log {
    daily
    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
}
Run Code Online (Sandbox Code Playgroud)

  • 可能应该使用从配置文件创建的 PID 文件......请参阅配置中的“processManagement.pidFilePath”或 SystemD 单元文件的 PIDFile 设置(对我来说是“/var/run/mongodb/mongod.pid”) (2认同)

小智 15

如果您在使用 logrotate 将日志文件移开后将 SIGUSR1 发送到 mongod,服务器就会崩溃。

以下配置对于我测试过的版本是安全的 - 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
}
Run Code Online (Sandbox Code Playgroud)

请参阅: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
Run Code Online (Sandbox Code Playgroud)


小智 13

copytruncate 对于 logrotation 效果很好。

与此类似的配置应该可以为您完成这项工作:

/var/log/mongodb/*.log {
  daily
  missingok
  rotate 5
  compress
  dateext
  delaycompress
  copytruncate
  notifempty
}
Run Code Online (Sandbox Code Playgroud)