跳至正文

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 \
       --systemLog.rotation.size 50000000

3.2 参数详解

参数 说明 示例值
--dbpath 数据存储目录 /data/gamedb
--port 监听端口 27017
--bind_ip 绑定 IP(安全起见用 127.0.0.1) 127.0.0.1
--logpath 日志文件路径(必选 /data/gamedb/mongodb.log
--logappend 日志追加模式,重启不覆盖 -
--systemLog.rotation.size 轮转大小(字节),超过自动新建文件 50000000(50MB)

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                           # 追加模式,不覆盖
--systemLog.rotation.size 50000000    # 50MB 自动轮转

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 自动轮转(推荐)

当前配置已启用:

--systemLog.rotation.size 50000000  # 50MB 自动轮转

工作原理

  • 当日志文件 > 50MB 时,自动创建新文件
  • 原文件重命名为 mongodb.log.1
  • 最多保留多个轮转文件(但不自动删除,所以仍需结合下面的手动清理操作)

方案二:手动清理

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

# 2. 手动轮转(让 MongoDB 重新创建日志文件)
mv /data/gamedb/mongodb.log /data/gamedb/mongodb.log.old

# 3. 重启 MongoDB 让新日志生效
pm2 restart mongodb

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

方案三:Linux logrotate(自动化)

# 创建 /etc/logrotate.d/mongodb
sudo tee /etc/logrotate.d/mongodb << 'EOF'
/data/gamedb/mongodb.log {
    daily              # 每天轮转一次
    rotate 7           # 保留 7 个文件
    compress           # 压缩旧文件
    delaycompress     # 延迟压缩(下次轮转时压缩)
    missingok         # 文件不存在不报错
    notifempty        # 空文件不轮转
    create 0640 $(whoami) $(whoami)  # 新文件权限
}
EOF

# 测试配置
sudo logrotate -d /etc/logrotate.d/mongodb

# 强制执行一次
sudo logrotate -f /etc/logrotate.d/mongodb

方案对比

方案 优点 缺点
MongoDB 自动轮转 简单,50MB 自动新建 不自动删除旧文件
手动清理 完全可控 需要人工执行
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

# 手动轮转日志
mv /data/gamedb/mongodb.log /data/gamedb/mongodb.log.old
pm2 restart mongodb

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

发表回复

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