阅读量:17
一、配置日志路径与级别
MongoDB在Linux上的日志管理首先需通过配置文件(通常为/etc/mongod.conf)设置日志的输出路径、级别及追加方式。关键参数如下:
- destination:指定日志输出目标,生产环境建议设为
file(文件存储); - path:日志文件路径,常见为
/var/log/mongodb/mongod.log(需确保目录存在且属主为mongodb用户); - logAppend:设为
true,确保日志追加到现有文件而非覆盖; - verbosity:日志详细程度(0-5),0为默认(仅记录启动、关闭、错误等基本信息),1-5逐步增加调试信息(如查询执行计划),生产环境建议保持0以避免日志膨胀。
二、日志轮转配置
为防止日志文件过大占用磁盘空间,需通过logrotate工具实现自动化轮转。步骤如下:
- 安装logrotate:若未安装,通过包管理器安装(Debian/Ubuntu:
sudo apt-get install logrotate;CentOS/RHEL:sudo yum install logrotate)。 - 创建MongoDB专属配置文件:编辑
/etc/logrotate.d/mongodb,添加以下内容:若需按大小轮转,可将/var/log/mongodb/mongod.log { daily # 每天轮转 rotate 7 # 保留7个旧日志文件 compress # 压缩旧日志(gzip) missingok # 日志文件丢失时不报错 notifempty # 日志为空时不轮转 create 640 mongodb mongodb # 新日志文件权限与所有者 sharedscripts # 所有日志轮转完成后执行postrotate postrotate /bin/kill -SIGUSR1 $(cat /var/log/mongodb/mongod.lock) # 触发MongoDB重新打开日志文件 endscript }daily替换为size 200M(当日志文件达到200MB时轮转),并添加dateext(保留日期后缀,如mongod.log-20251106)。
三、日志查看与实时监控
- 实时查看日志:使用
tail -f命令追踪日志文件的实时更新,例如:可结合tail -f /var/log/mongodb/mongod.loggrep过滤关键信息(如错误日志:tail -f /var/log/mongodb/mongod.log | grep -i "error")。 - 查看日志内容:使用
less分页查看(less /var/log/mongodb/mongod.log)或head查看前几行(head -n 20 /var/log/mongodb/mongod.log)。
四、日志分析与诊断
- 内置命令:通过MongoDB Shell查看日志组件配置(
db.getLogComponents())或获取所有日志(db.adminCommand({ getLog: 1 }));手动触发日志轮转可使用db.runCommand({ logRotate: 1 })。 - 第三方工具:
- mtools:MongoDB官方推荐的日志分析工具,支持慢查询筛选、可视化等。安装:
sudo pip3 install mtools;常用命令:mlogfilter(筛选慢查询)、mplotqueries(生成查询散点图)、mloginfo(日志统计)。 - grep/awk:快速提取关键信息,例如提取执行时间超过100ms的慢查询:
grep "COMMAND" /var/log/mongodb/mongod.log | awk '/ms > 100/ {print $0}'。
- mtools:MongoDB官方推荐的日志分析工具,支持慢查询筛选、可视化等。安装:
五、日志备份与归档
- 定期备份:使用
rsync或cp命令将日志复制到备份目录,例如:sudo rsync -av /var/log/mongodb/mongod.log /backup/mongodb/ - 日志归档:通过脚本自动归档并清理旧日志。例如,Python脚本将日志移动到归档目录并按30天阈值删除:
import os import shutil from datetime import datetime LOG_DIR = '/var/log/mongodb/' ARCHIVE_DIR = '/var/log/mongodb/archive/' def archive_logs(): if not os.path.exists(ARCHIVE_DIR): os.makedirs(ARCHIVE_DIR) today = datetime.now().strftime('%Y-%m-%d') log_file = f"{LOG_DIR}mongod.log" archive_file = f"{ARCHIVE_DIR}mongod_{today}.log" shutil.move(log_file, archive_file) print(f"日志已归档至 {archive_file}") def clean_old_logs(): files_in_archive = os.listdir(ARCHIVE_DIR) for file in files_in_archive: file_path = os.path.join(ARCHIVE_DIR, file) if os.path.isfile(file_path): if os.path.getmtime(file_path) < time class="hljs-number">30 * 86400: # 30天前 os.remove(file_path) print(f"已删除过期日志:{file_path}")
六、注意事项
- 权限管理:确保日志目录(如
/var/log/mongodb/)属主为mongodb用户(chown mongodb:mongodb /var/log/mongodb/),避免权限问题导致日志无法写入。 - 磁盘空间监控:使用
df -h定期检查日志分区使用情况,设置阈值告警(如90%),防止磁盘满导致服务中断。 - 生产环境优化:保持
verbosity为0,仅在调试时临时提高;开启logAppend避免日志覆盖;合理设置rotate参数(如保留7天或200MB),平衡日志保留需求与磁盘空间。