默认情况下,MongoDB的日志始终会写到同一个文件中。在Linux系统下,这个日志文件为 /var/log/mongodb/mongodb.log
。随着时间的推移,这个文件会越来越大:
kingname@xxx:/var/log/mongodb$ ls -lh total 43G -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中:
kingname@xxx:/var/log/mongodb$ mongo # 切换到admin库 > use admin switched to db admin # 执行命令rotate日志 > 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中执行命令:
# 在Linux下用-aux ps -aux | grep mongo # 在mac下用-ef ps -ef | grep mongo
从左数第二项就是MongoDB的PID,如下图所示:
此时,执行命令:
# kill -SIGUSR1 PID kill -SIGUSR1 561
就可以实现rotate日志。这个地方的命令虽然是 kill
,但是不用担心,这并不是杀死MongoDB的进程,只是给它发一个信号而已。