Ubuntu MongoDB日志管理技巧
日志的基础管理始于合理配置路径与详细程度。通过修改MongoDB配置文件/etc/mongod.conf,可设置日志的输出目标、位置及详细级别:
systemLog.destination设为file(文件输出),systemLog.path指定具体路径(如/var/log/mongodb/mongod.log),确保MongoDB进程对该路径有写入权限;logAppend: true保证日志追加到文件末尾,避免重启服务时覆盖历史日志;verbosity控制详细程度(0=默认,仅记录错误与关键信息;1=信息级;2=警告;3=错误;4=严重错误;5=调试),生产环境建议保持0或1,调试时可临时调高,用完后恢复以避免日志膨胀。日志文件长期增长会占用大量磁盘空间,需通过logrotate工具实现自动化管理。创建或编辑/etc/logrotate.d/mongodb文件,添加以下配置:
/var/log/mongodb/mongod.log {
daily # 每天轮转一次
rotate 7 # 保留最近7个轮转日志
compress # 使用gzip压缩旧日志(节省空间)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 640 mongodb mongodb # 新日志文件权限与所有者(mongodb用户)
postrotate # 轮转后执行的命令(通知MongoDB重新打开日志文件)
/bin/kill -SIGUSR1 $(cat /var/log/mongodb/mongod.lock 2>/dev/null) 2>/dev/null || true
endscript
}
配置完成后,运行sudo logrotate -v /etc/logrotate.d/mongodb测试有效性,或等待系统每日自动执行。
若需立即轮转日志(如日志文件过大),可通过以下两种方式手动触发:
db.runCommand({logRotate: 1}),MongoDB会自动重命名当前日志文件(如mongod.log.2025-10-31T10-00-00)并创建新日志;SIGUSR1信号,命令为sudo kill -SIGUSR1 $(cat /var/log/mongodb/mongod.lock)(需替换为实际锁文件路径)。日常运维中,需快速定位关键信息,可使用以下命令:
sudo tail -f /var/log/mongodb/mongod.log,实时显示日志新增内容(按Ctrl+C退出);sudo grep -i "error" /var/log/mongodb/mongod.log,提取所有错误日志(忽略大小写);sudo grep "COMMAND" /var/log/mongodb/mongod.log | awk '/ms > 100/ {print $0}',过滤执行时间超过100ms的查询(需配合慢查询阈值设置)。对于复杂日志分析,可借助专业工具提升效率:
sudo pip3 install mtools;常用功能:mloginfo --slow /var/log/mongodb/mongod.log(统计慢查询信息)、mplotqueries /var/log/mongodb/mongod.log --type scatter(生成查询执行时间散点图,需安装matplotlib);为避免日志占用过多磁盘空间,需采取以下优化措施:
/log/mongodb),避免与数据文件(/data/mongodb)竞争I/O。创建分区并修改配置:sudo mkdir -p /log/mongodb,sudo chown mongodb:mongodb /log/mongodb,更新/etc/mongod.conf中的systemLog.path为/log/mongodb/mongod.log;df -h /log定期检查日志分区使用率,或编写脚本(如通过cron定时运行)发送告警(如使用率超过90%时邮件通知);logrotate的rotate参数保留必要日志,或手动删除过期日志(如find /var/log/mongodb/mongod.log.* -mtime +30 -exec rm -f {} \;,删除30天前的日志)。