Mongodb - 旋转日志的正确方法

Mongodb - 旋转日志的正确方法

蒙戈文档我可以说:

  1. 使用 -SIGUSR1 信号并重命名旧日志并切换当前日志
  2. 从操作系统使用 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-44SIGUSR1 切换的痕迹一样。如何摆脱后者?

答案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但这应该是一个简单的补充

相关内容