mongo默认是没有进行日志分割的,所有的日志持续写到一个文件中。缺点是很明显的,日志文件会越来越大
- 占用过多磁盘空间
- 日志文件写入性能越来越低
- 问题排查越来越困难
配置分割策略
要实现日志分割,首先要配置日志分割策略,在mongodb的配置中,systemLog
下添加logRotate
配置。
logRotate总共有两种取值:
rename
说实话,不是很理解这个名字。
这种策略下,需要写一个shell脚本,加到crontab里面
shell脚本内容如下:
#!/bin/sh
datafile=/var/run/mongodb
logfile=/var/log/mongodb
days=15
/bin/kill -SIGUSR1 `cat $datafile/mongod.pid`
find $logfile/ -mtime +$days -delete
crontab配置每晚凌晨0点执行
0 0 * * * /opt/shell/mongodb_log_rotate.sh > /dev/null 2>&1 &
脚本干了两件事
- 给mongod进程发出SIGUSR1信号之后,mongod就会乖乖的分割日志。
- 清除超过15天的日志
reopen
如果是通过Linux或者Unix系统的logRotate工具来分割,就需要指定reopen, 当然logappend
必须也不能少。关闭文件然后重新打开可以防止日志文件丢失。
你需要在/etc/logrotate.d/
目录下新建一个名为mongod的文件,加上如下内容:
/var/log/mongodb /*log {
create 0644 mongod mongod
daily
rotate 15
missingok
notifempty
compress
sharedscripts
postrotate
/bin/kill -USR1 `cat /run/mongodb/mongod.pid 2>/dev/null` 2>/dev/null || true
endscript
}
这个配置文件的权限必须为-rw-r--r--
,不然logrotate不认。
分割之后的文件名格式就是文件名加上分割的时间戳,如mongod.log.2018-05-16T13-08-58
。当然这个时间格式可以通过timeStampFormat
来配置,默认的是iso8601-local
,还可以选择ctime
和iso8601-utc