暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一日一技:手动rotate MongoDB的日志

未闻Code 2021-04-18
2459

默认情况下,MongoDB的日志始终会写到同一个文件中。在Linux系统下,这个日志文件为 /var/log/mongodb/mongodb.log
。随着时间的推移,这个文件会越来越大:

  1. kingname@xxx:/var/log/mongodb$ ls -lh

  2. total 43G

  3. -rw------- 1 mongodb mongodb 43G Jun 6 17:54 mongod.log

这样的大日志占用了太多了储存空间。但由于此时MongoDB正在往里面写入数据,所以不应该直接删除它,否则可能会导致不可预料的问题。

现在需要让MongoDB把日志写到另一个文件中,从而释放当前文件,然后再删除这个大日志文件。

要实现这个目的,可以使用MongoDB的 rotate
功能。在MongoDB的官方文档中写到:

When used with the --logpath option or systemLog.path setting, mongod and mongos instances report a live account of all activity and operations to a log file. When reporting activity data to a log file, by default, MongoDB only rotates logs in response to the logRotate command, or when the mongod or mongos process receives a SIGUSR1 signal from the operating system.

翻译过来就是,当你通过 --logpath
参数指定了日志的位置以后,MongoDB会始终把日志写到这个文件中,除非你执行了 logRotate
命令,或者MongoDB的进程收到了 SIGUSR1
信号。

文档地址为:https://docs.mongodb.com/manual/tutorial/rotate-log-files/

文档中提到了两种办法:

执行 logRotate
命令

进入MongoDB的shell中:

  1. kingname@xxx:/var/log/mongodb$ mongo


  2. # 切换到admin库

  3. > use admin

  4. switched to db admin


  5. # 执行命令rotate日志

  6. > db.adminCommand( { logRotate : 1 } )

命令执行完成以后,退出MongoDB的Shell,重新查看日志文件夹,可以发现如下图所示:

此时, mongod.log
文件变成了22KB,而多出一个 mongod.log.2019-06-06T09-54-03
,这个文件有43GB,这就是之前的大日志文件。MongoDB在Rotate日志的时候,会首先把原来的日志改名为 mongod.log.日期
,然后重新创建一个新的 mongod.log
文件,并把新的日志写入进去。

现在就可以直接删除 mongod.log.2019-06-06T09-54-03
从而释放硬盘空间了。

向MongoDB进程发送信号

第二种方式,就是向MongoDB的进程发送信号。为了实现这个目的,首先需要获得进程的 pid
。在Linux或者mac中执行命令:

  1. # 在Linux下用-aux

  2. ps -aux | grep mongo


  3. # 在mac下用-ef

  4. ps -ef | grep mongo

从左数第二项就是MongoDB的PID,如下图所示:

此时,执行命令:

  1. # kill -SIGUSR1 PID

  2. kill -SIGUSR1 561

就可以实现rotate日志。这个地方的命令虽然是 kill
,但是不用担心,这并不是杀死MongoDB的进程,只是给它发一个信号而已。


文章转载自未闻Code,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论