MongoDB在Debian系统中的主配置文件为/etc/mongod.conf,所有日志相关的参数均在此文件中设置。
通过systemLog.path参数指定日志文件的存储路径,默认路径为/var/log/mongodb/mongod.log。修改时需确保目录存在且具备正确的读写权限(属主为mongodb用户,属组为adm)。
示例配置:
systemLog:
destination: file # 日志输出目标(file/file+syslog)
path: /var/log/mongodb/mongod.log
logAppend: true # 追加模式(避免重启覆盖日志)
通过systemLog.verbosity参数控制日志详细程度,取值范围为0(默认,仅记录警告和错误)到5(记录所有操作细节,包括调试信息)。级别越高,日志量越大。
示例配置:
systemLog:
verbosity: 1 # 仅记录重要信息(警告、错误)
logrotate是Debian系统默认的日志轮转工具,可自动切割、压缩和归档MongoDB日志,避免单个日志文件过大占用磁盘空间。
安装logrotate(若未安装):
sudo apt-get install logrotate
创建MongoDB专属轮转配置:
在/etc/logrotate.d/目录下创建mongodb文件,添加以下内容:
/var/log/mongodb/mongod.log {
daily # 每天轮转一次(可改为weekly/monthly)
rotate 7 # 保留最近7个轮转日志文件
compress # 使用gzip压缩旧日志(节省空间)
missingok # 若日志文件不存在,不报错
notifempty # 若日志为空,不轮转
create 0640 mongodb adm # 创建新日志文件,权限0640,属主mongodb,属组adm
sharedscripts # 所有日志轮转完成后执行postrotate脚本
postrotate # 轮转后通知mongod重新打开日志文件
/bin/kill -SIGUSR1 $(cat /var/log/mongodb/mongod.lock 2>/dev/null) 2>/dev/null || true
endscript
}
说明:postrotate脚本通过发送SIGUSR1信号通知mongod进程切换到新日志文件,确保日志不丢失。
手动触发轮转测试:
sudo logrotate -vf /etc/logrotate.d/mongodb # -v显示详细过程,-f强制轮转
若不想依赖logrotate,可通过以下两种方式手动轮转:
use admin;
db.runCommand({ logRotate: 1 }); // 通知mongod轮转日志
sudo kill -SIGUSR1 $(pgrep mongod) # 获取mongod进程ID并发送信号
sudo tail -f /var/log/mongodb/mongod.log
sudo tail -n 50 /var/log/mongodb/mongod.log # 查看最后50行
sudo grep "ERROR" /var/log/mongodb/mongod.log # 筛选包含"ERROR"的日志
sudo cat /var/log/mongodb/mongod.log | jq '.msg' # 提取日志中的"msg"字段
logrotate的rotate参数可设置保留的轮转日志数量(如rotate 7保留7天),超过数量的旧日志会自动删除,无需手动干预。
若需自定义归档策略(如保留30天),可编写脚本定期执行:
#!/bin/bash
LOG_DIR="/var/log/mongodb"
ARCHIVE_DIR="$LOG_DIR/archive"
mkdir -p "$ARCHIVE_DIR"
# 归档当天日志
mv "$LOG_DIR/mongod.log" "$ARCHIVE_DIR/mongod_$(date +%Y-%m-%d).log"
# 重启mongod以创建新日志文件
sudo systemctl restart mongod
# 删除30天前的归档日志
find "$ARCHIVE_DIR" -type f -name "mongod_*.log" -mtime +30 -exec rm {} \;
将脚本添加到crontab中,每天凌晨执行:
sudo crontab -e
添加以下内容:
0 0 * * * /path/to/archive_logs.sh
/var/log/mongodb/目录的属主为mongodb用户,避免日志写入失败。du -sh /var/log/mongodb/),避免日志占满磁盘。1(信息)或2(警告),避免0(默认)导致的关键信息遗漏,或过高级别(如5)导致的日志量爆炸。