Mongodb-轮换日志的正确方法


13

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
}

到/etc/logrotate.d/mongo。

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

Answers:


11

copytruncate对于logrotation非常有效。

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

/var/log/mongodb/*.log {
  daily
  missingok
  rotate 5
  compress
  dateext
  delaycompress
  copytruncate
  notifempty
}

1
在RedHat 6.5上,这对我不起作用。日志已轮换,但原始.log文件继续增长而没有限制。
Thomas Bratt 2014年

@ThomasBratt这是正确的,因为在不重新启动mongo进程的情况下,文件处理程序将保持打开状态。实际上,这种方法不能很好地工作。
Mxx 2014年

@ThomasBratt看一下这个答案stackoverflow.com/a/8396266/949859
Mxx

1
@Mxx很好的发现-看起来copytruncate将与postrotate步骤一起工作,以信号通知Mongo截断日志文件
Thomas Bratt 2014年

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
}

请参阅: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

我在蒙戈2.6.11在CentOS 7的伟大工程
蒂姆·

我不得不用mongod.log替换mongodb.log,并且可以正常工作
cwhisperer 16-10-15

可以确认如果systemLog.logRotate: reopen在中mongod.conf,则pkill将按预期工作,并且不需要删除已重命名的日志文件,因为不会创建任何文件。
朱利安·林

15

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

systemLog:
  logAppend: true
  logRotate: reopen

另请参阅《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
}

应该使用从配置文件创建的PID文件。...请参见processManagement.pidFilePath配置或SystemD单元文件的PIDFile设置(/var/run/mongodb/mongod.pid对我而言)
Gert van den Berg,

0

以下为我工作:

/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在/bin/sh- 下运行- SIGUSR1在RedHat 6.5 上无法识别
  • 我没有测试过,compress但这应该是一个直观的补充

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.