目录
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