Debian系统MongoDB日志管理技巧
日志配置的核心是通过MongoDB配置文件(/etc/mongod.conf)调整路径和详细程度。关键参数说明:
file表示文件,syslog表示系统日志,默认为file);/var/log/mongodb/mongod.log);true时,重启服务会追加日志而非覆盖(推荐开启);systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
verbosity: 1
修改后需重启MongoDB服务使配置生效:sudo systemctl restart mongod。
日志轮转可防止日志文件过大占用磁盘空间,常用方法有两种:
logrotate是Linux系统自带的日志管理工具,需创建自定义配置文件(/etc/logrotate.d/mongodb),内容示例如下:
/var/log/mongodb/mongod.log {
daily # 每天轮转一次(可改为weekly/monthly)
missingok # 若日志文件丢失,不报错继续执行
rotate 7 # 保留最近7个轮转日志文件
compress # 使用gzip压缩旧日志(节省空间)
notifempty # 若日志为空,不进行轮转
create 0640 mongodb adm # 创建新日志文件,权限0640,属主mongodb、属组adm
sharedscripts # 所有日志轮转完成后执行postrotate脚本
postrotate # 轮转后发送SIGUSR1信号,通知mongod重新打开日志文件
/bin/kill -SIGUSR1 `cat /var/log/mongodb/mongod.lock` 2>/dev/null || true
endscript
}
配置完成后,logrotate会根据/etc/logrotate.conf中的daily设置自动执行(或手动运行sudo logrotate -vf /etc/logrotate.d/mongodb测试)。
若不想依赖logrotate,可通过以下两种方式手动轮转:
db.adminCommand({logRotate: 1}),mongod会自动重命名当前日志文件(附加时间戳)并创建新日志文件;pgrep mongod),然后执行kill -SIGUSR1 <PID>,强制mongod轮转日志。日常运维中,需快速定位问题或监控数据库状态,常用命令:
sudo tail -f /var/log/mongodb/mongod.log(动态显示新增日志);sudo grep "ERROR" /var/log/mongodb/mongod.log(查找错误日志)、sudo grep "slow" /var/log/mongodb/mongod.log(查找慢查询日志);jq工具解析JSON格式日志(需安装sudo apt install jq),例如提取所有日志消息:sudo cat /var/log/mongodb/mongod.log | jq '.msg'。长期运行的MongoDB会产生大量日志,需定期归档旧日志以释放空间:
编写Shell脚本(如/usr/local/bin/archive_mongodb_logs.sh),实现日志归档与清理:
#!/bin/bash
LOG_DIR="/var/log/mongodb"
ARCHIVE_DIR="$LOG_DIR/archive"
CURRENT_DATE=$(date +%Y-%m-%d)
# 创建归档目录(若不存在)
mkdir -p "$ARCHIVE_DIR"
# 归档当前日志(移动并重命名)
if [ -f "$LOG_DIR/mongod.log" ]; then
mv "$LOG_DIR/mongod.log" "$ARCHIVE_DIR/mongod_$CURRENT_DATE.log"
# 重新创建空日志文件(避免服务中断)
touch "$LOG_DIR/mongod.log"
chown mongodb:mongodb "$LOG_DIR/mongod.log"
fi
# 清理30天前的归档日志
find "$ARCHIVE_DIR" -type f -name "mongod_*.log" -mtime +30 -exec rm -f {} \;
添加执行权限并设置crontab每日执行:
sudo chmod +x /usr/local/bin/archive_mongodb_logs.sh
echo "0 0 * * * /usr/local/bin/archive_mongodb_logs.sh" | sudo tee /etc/cron.daily/archive_mongodb_logs
若无需归档,可直接删除超过一定时间的日志文件(如30天前):
sudo find /var/log/mongodb -name "*.log.*" -mtime +30 -exec rm -f {} \;
操作前建议备份重要日志,避免误删。
若需更细粒度的日志控制(如仅记录查询日志、忽略慢查询),可调整日志组件级别:
db.getLogComponents()(返回各组件(如query、replication)的verbosity值);db.setLogLevel(<级别>, "<组件>")(例如,将查询组件级别设为2,仅记录警告及以上查询日志:db.setLogLevel(2, "query"))。db.setLogLevel(0, "replication")
注意:修改组件级别后无需重启服务,立即生效。