跳至正文

MongoDB 日志配置与维护指南

目录

  1. MongoDB 为什么需要日志?
  2. MongoDB 自带日志和 PM2 日志的区别
  3. MongoDB 自带日志的命令格式和参数详解
  4. 如何查看日志和问题处理
  5. 为什么要清理日志?
  6. 日志清理方案

1. MongoDB 为什么需要日志?

MongoDB 日志是排查问题的唯一依据,主要作用:

作用 说明
排查错误 数据库连接失败、查询超时、权限问题等
性能分析 慢查询日志帮助优化数据库性能
安全审计 记录用户操作、登录尝试等
故障恢复 分析崩溃原因、恢复数据参考
日常监控 了解数据库运行状态

没有日志 = 出了问题只能盲猜


2. MongoDB 自带日志和 PM2 日志的区别

2.1 日志来源对比

特性 MongoDB 自带日志 (--logpath) PM2 日志 (error_file/out_file)
日志内容 数据库内部所有操作 进程标准输出/错误
日志级别 可配置详细程度 只有 stdout/stderr
轮转功能 MongoDB 自己管理 需配合 pm2-logrotate
配置方式 启动参数 --logpath PM2 配置文件

2.2 内容示例

# MongoDB 自带日志 - 详细丰富
{"t":{"$date":"2026-03-24T10:00:00.123+08:00"},"s":"I",  "c":"NETWORK",  "id":12345, "msg":"Connection accepted","attr":{"peer":"127.0.0.1:12345"}}

# PM2 日志 - 只有进程输出
> mongod --dbpath /data/gamedb --port 27017

2.3 结论

MongoDB 必须使用自己的日志系统,PM2 的日志配置对 MongoDB 无效或不全。


3. MongoDB 自带日志的命令格式和参数详解

3.1 启动命令

mongod --dbpath /data/gamedb \
       --port 27017 \
       --bind_ip 127.0.0.1 \
       --logpath /data/gamedb/mongodb.log \
       --logappend

3.2 参数详解

参数 说明 示例值
--dbpath 数据存储目录 /data/gamedb
--port 监听端口 27017
--bind_ip 绑定 IP(安全起见用 127.0.0.1) 127.0.0.1
--logpath 日志文件路径(必选 /data/gamedb/mongodb.log
--logappend 日志追加模式,重启不覆盖 -

3.3 日志级别

级别 说明
F Fatal - 致命错误
E Error - 错误
W Warning - 警告
I Info - 信息(默认)
D Debug - 调试

默认是 I 级别,生产环境足够。

3.4 当前配置说明

--dbpath /data/gamedb                 # 数据目录
--port 27017                          # 端口
--bind_ip 127.0.0.1                   # 只允许本地访问
--logpath /data/gamedb/mongodb.log    # 日志文件
--logappend                           # 追加模式,不覆盖

3.5 关于日志轮转

注意:MongoDB 8.0+ 不支持 --systemLog.rotation.size 命令行参数。

日志轮转需要使用 Linux logrotate 工具实现(见第 6 章)。


4. 如何查看日志和问题处理

4.1 查看日志命令

# 查看完整日志(最后 100 行)
tail -n 100 /data/gamedb/mongodb.log

# 实时查看日志(Ctrl+C 退出)
tail -f /data/gamedb/mongodb.log

# 查看所有日志(包含轮转的)
ls -lh /data/gamedb/mongodb.log*

# 只看错误
grep "error" /data/gamedb/mongodb.log

# 只看最近 1 小时的日志
grep "$(date -d '1 hour ago' '+%Y-%m-%dT%H')" /data/gamedb/mongodb.log

4.2 常见问题及处理

问题 1:连接被拒绝

Error: connect ECONNREFUSED 127.0.0.1:27017

原因:MongoDB 未启动

# 检查进程
ps aux | grep mongod

# 启动 MongoDB
pm2 restart mongodb

问题 2:数据目录权限不足

Fatal Assertion 28595 Exception: mongo::mkdir failed:
# 修复权限
sudo chown -R mongodb:mongodb /data/gamedb
# 或(如果不用 mongodb 用户)
sudo chown -R $(whoami) /data/gamedb

问题 3:端口被占用

Error: Address already in use
# 查看占用端口的进程
lsof -i:27017

# 停止占用进程
kill -9 

问题 4:连接超时

MongoNetworkError: connect ETIMEDOUT

原因:网络问题或 MongoDB 负载过高

# 查看连接数
mongosh --eval "db.serverStatus().connections"

# 查看慢查询
grep "slow query" /data/gamedb/mongodb.log

问题 5:磁盘空间不足

Error: No space left on device
# 查看磁盘使用
df -h

# 清理日志(见下文)
find /data/gamedb -name "mongodb.log.*" -mtime +7 -delete

5. 为什么要清理日志?

5.1 原因

原因 说明
磁盘空间 日志会不断增长,最终占满磁盘
性能影响 日志文件过大会影响写入性能
可读性 大文件难以打开和搜索

5.2 不清理的风险

  • 磁盘写满 → 数据库无法写入 → 服务崩溃
  • 无法生成日志 → 无法排查问题

6. 日志清理方案

注意:MongoDB 8.0+ 不支持命令行参数控制日志轮转。

必须使用 Linux logrotate 工具实现日志自动轮转。

方案一:Linux logrotate(推荐)

logrotate 是 Linux 系统自带的日志轮转工具。

注意:请将下面的 用户名 替换为运行 MongoDB 的实际用户(如 rootmongod 或你当前的用户)。

# 1. 创建 logrotate 配置文件
sudo tee /etc/logrotate.d/mongodb << 'EOF'
/data/gamedb/mongodb.log {
    daily              # 每天检查并轮转一次
    size 50M           # 超过 50MB 时立即轮转(优先于 daily)
    rotate 7           # 保留 7 个文件
    compress           # 压缩旧文件(节省空间)
    delaycompress     # 延迟压缩(下次轮转时压缩)
    missingok         # 文件不存在不报错
    notifempty        # 空文件不轮转
    create 0640 用户名 用户名  # 替换为实际用户名
    postrotate
        # 轮转后通知 MongoDB 重新打开日志文件
        pkill -USR1 mongod
    endscript
}
EOF

# 2. 测试配置(不实际执行)
sudo logrotate -d /etc/logrotate.d/mongodb

# 3. 强制执行一次(测试用)
sudo logrotate -f /etc/logrotate.d/mongodb

# 4. 查看效果
ls -lh /data/gamedb/mongodb.log*

配置创建后会自动执行,不需要额外操作。

参数说明

参数 说明
daily 每天检查一次
size 50M 超过 50MB 立即轮转
rotate 7 保留 7 个旧文件
compress 压缩旧文件为 .gz
postrotate/endscript 轮转后执行命令,让 MongoDB 重新打开日志

方案二:手动清理

# 1. 查看日志文件大小
ls -lh /data/gamedb/mongodb.log*

# 2. 手动轮转
mv /data/gamedb/mongodb.log /data/gamedb/mongodb.log.old

# 3. 通知 MongoDB 重新打开日志
db.adminCommand({logRotate: 1})

# 4. 清理超过 7 天的旧日志
find /data/gamedb -name "mongodb.log.*" -mtime +7 -delete

方案对比

方案 优点 缺点
logrotate(推荐) 完全自动化,无需人工干预 需要配置
手动清理 完全可控 需要人工执行

附录:快速参考命令

# 查看日志
tail -f /data/gamedb/mongodb.log

# 查看错误
grep -i error /data/gamedb/mongodb.log

# 查看连接数
mongosh --eval "db.serverStatus().connections"

# 查看当前日志大小
ls -lh /data/gamedb/mongodb.log

# 手动轮转日志(推荐方式)
db.adminCommand({logRotate: 1})

# 清理 7 天前的旧日志
find /data/gamedb -name "mongodb.log.*" -mtime +7 -delete

# 配置 logrotate(只需执行一次)
# 创建 /etc/logrotate.d/mongodb 文件,内容见上文第 6 章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注