日志管理的第一步是合理配置基础参数,确保日志输出符合需求。主要涉及以下配置项(通过mongod.conf文件设置):
systemLog.destination指定,可选file(文件)或syslog(系统日志)。若用file,需配合path设置日志文件路径(如/var/log/mongodb/mongod.log);若用syslog,需确保--logpath未设置(避免冲突)。systemLog.logAppend设为true(默认),确保日志追加到现有文件末尾,而非覆盖。systemLog.verbosity控制详细程度,取值范围0-4(0=仅致命错误,1=默认/信息,2=警告,3=错误,4=严重错误)。生产环境建议设为1(平衡详细度与性能),调试时可临时调高至3或4。日志轮转是防止日志文件过大、占用磁盘空间的关键手段,主要有三种方式:
默认行为(--logRotate rename):通过重命名当前日志文件(附加UTC时间戳,如mongod.log.2025-11-02T10:00:00Z),创建新日志文件接收后续日志。适用于单实例或需要保留完整历史日志的场景。
操作步骤:
use admin; db.adminCommand({logRotate: "server"});logRotate: "audit"同时轮换审计日志(审计日志轮换方式与服务器日志一致)。通过系统级工具实现自动化轮转,支持按时间(daily/weekly/monthly)或大小(size)触发,可压缩旧日志、保留指定数量文件。
配置示例(创建/etc/logrotate.d/mongodb文件):
/var/log/mongodb/mongod.log {
daily # 每天轮转
rotate 7 # 保留7个旧日志文件
compress # 压缩旧日志(gzip)
missingok # 日志文件丢失时不报错
notifempty # 日志为空时不轮转
create 0640 mongodb adm # 创建新日志文件,权限0640,属主mongodb、属组adm
sharedscripts # 所有日志轮转完成后执行postrotate脚本
postrotate
/bin/kill -SIGUSR1 $(cat /var/run/mongodb/mongod.pid) 2>/dev/null || \
/bin/kill -SIGUSR1 `cat /var/log/mongodb/mongod.lock` 2>/dev/null
endscript
}
说明:postrotate脚本通过发送SIGUSR1信号通知MongoDB重新打开日志文件,确保轮转后新日志写入新文件。
通过操作系统信号强制轮转单个MongoDB进程的日志(适用于无法使用logrotate的场景)。
操作命令(需替换为实际PID):
kill -SIGUSR1 $(pgrep mongod)
注意:此方法不会自动压缩或删除旧日志,需配合脚本实现自动化。
为减少人工干预,需通过脚本和定时任务实现自动化:
编写脚本压缩旧日志并删除超过保留期限的文件(如7天前),例如:
#!/bin/bash
LOG_DIR="/var/log/mongodb"
ARCHIVE_DIR="$LOG_DIR/archive"
DAYS_TO_KEEP=7
# 创建归档目录
mkdir -p "$ARCHIVE_DIR"
# 压缩并移动旧日志
find "$LOG_DIR" -name "mongod.log.*" -mtime +$DAYS_TO_KEEP -exec gzip {} \; -exec mv {}.gz "$ARCHIVE_DIR" \;
# 删除压缩后超过30天的文件
find "$ARCHIVE_DIR" -name "*.gz" -mtime +30 -exec rm -f {} \;
将脚本添加到crontab(每天凌晨2点执行):
0 2 * * * /path/to/log_cleanup.sh
tail -f /var/log/mongodb/mongod.log跟踪最新日志;grep提取错误或警告(如grep "ERROR" /var/log/mongodb/mongod.log);df -h /var/log检查日志分区使用情况,避免磁盘满导致服务中断。日志分析可快速定位性能问题或异常,常用工具:
grep:过滤特定关键词(如grep "slow query" /var/log/mongodb/mongod.log);awk:统计日志条目数量(如awk '{print $1}' /var/log/mongodb/mongod.log | sort | uniq -c);jq(JSON格式日志):提取日志消息(如cat /var/log/mongodb/mongod.log | jq '.msg')。将MongoDB日志发送到ELK(Elasticsearch+Logstash+Kibana)平台,实现日志的集中存储、搜索和可视化。
配置步骤:
Logstash收集日志(配置input为文件,filter解析JSON格式,output到Elasticsearch);Kibana创建仪表盘,展示日志趋势、错误分布等指标。mongodb用户,属组设为adm(或其他运维组),权限设为640(-rw-r-----),防止未授权用户读取敏感信息(如数据库操作记录);logLevel调整(如设为1,仅记录必要信息)或使用logFilter插件过滤。