默认安装好MongoDB后是没有日志分割的。比如搭建MongoDB副本集,运行一段时间后发现日志文件变的很大。过大的日志文件造成磁盘空间浪费,写入性能降低,而且在大文件中查找问题麻烦。虽然MongoDB提供了关闭日志的配置参数,但官方不推荐。那么为了避免实际使用中一个日志文件过大,我们需要对日志进行切割。
MongoDB提供了一个 “systemLog.logRotate” 参数,可配置 rename 或者 reopen,默认是rename。
官方文档:https://docs.mongodb.com/v3.2/reference/configuration-options/#systemLog.logRotate
例如配置文件:
# where to write logging data. systemLog: verbosity: 0 destination: file logAppend: true logRotate: rename path: /var/log/mongodb/mongod27017.log
Rename
姑且根据字面意思认为是重命名,官方文档中也没有找到其他详细的说明。向MongoDB进程发送 SIGUSR1 信号,会自动切割日志,例如老日志文件以 mongodb27017.log.2019-08-19T11:00:00 保存。写脚本配置crontab实现日志切割。
脚本:
#!/bin/sh datafile=/var/run/mongodb logfile=/var/log/mongodb days=15 /bin/kill -SIGUSR1 `cat $datafile/mongod27017.pid` find $logfile/ -mtime +$days -delete
计划任务:
0 0 * * * /root/scripts/mongodb_log_rotate.sh > /dev/null 2>&1 &
Reopen
通过Linux或者Unix系统的logrotate工具关闭和重新打开文件,在使用logrotate时要设置成reopen模式,可以避免日志丢失。同时开启这个配置后需要确认 systemLog.logAppend 是true。修改配置后重启MongoDB 。
在/etc/logrotate.d/目录下新建一个名为mongod的文件,加上如下内容:
/var/log/mongodb/*.log { create 0644 mongod mongod daily rotate 30 missingok notifempty compress sharedscripts postrotate /bin/kill -USR1 `cat /var/run/mongodb/mongod27017.pid 2>/dev/null` 2>/dev/null || true endscript }
通过这两种方法都可以实现日志分割,个人使用的是 reopen + logrotate 的方案。
参考:
MongoDB安装:http://blog.nbqykj.cn/?p=2927.html
MongoDB副本集搭建:http://blog.nbqykj.cn/?p=2933.html
日志分割:https://www.jianshu.com/p/c3cf130bbf78
评论列表(0条)
电商专用快递网站,空包网,单号网www.danhw.com
❗ 😎 优秀
厉害了,我记得我们公司使用的nginx软件txt日志都4G多了,根本无法打开了,原来还能日志分割啊!学习了 ➡
是的,日志大很不好管理,logrotate其实是老技术了。