Skip to content

MongoDB 日志类型与位置

系统日志

用途

  • 记录 MongoDB 服务器的运行状态
  • 包含启动、关闭、错误、警告等信息
  • 用于故障诊断和性能监控
  • 支持不同的日志级别

日志级别

  • quiet:只记录严重错误
  • v:详细模式,输出更多信息
  • vv:更详细的调试信息
  • vvv:非常详细的调试信息,包括复制和选举信息
  • vvvv:最详细的调试信息,包括低级网络活动

审计日志

用途

  • 记录数据库的访问和操作
  • 包含用户认证、授权、CRUD 操作等
  • 用于安全审计和合规性要求
  • 支持多种输出格式

记录内容

  • 用户登录和登出
  • 数据库和集合操作
  • 索引创建和删除
  • 用户和角色管理
  • 集群配置变更

慢查询日志

用途

  • 记录执行时间超过阈值的查询
  • 用于性能优化和查询分析
  • 包含查询语句、执行时间、扫描文档数等
  • 支持不同的慢查询阈值设置

记录内容

  • 查询语句
  • 执行时间(毫秒)
  • 扫描文档数
  • 返回文档数
  • 索引使用情况
  • 客户端信息

日志位置配置

默认位置

Linux/macOS

  • 默认日志目录:/var/log/mongodb/
  • 默认日志文件:mongod.log
  • 可通过配置文件修改

Windows

  • 默认日志目录:C:\Program Files\MongoDB\Server\{version}\log\
  • 默认日志文件:mongod.log
  • 可通过配置文件或命令行参数修改

配置文件设置

mongod.conf 示例

yaml
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
  logRotate: reopen
  verbosity: 0

auditLog:
  destination: file
  format: BSON
  path: /var/log/mongodb/audit.log

operationProfiling:
  slowOpThresholdMs: 100
  mode: slowOp

关键配置项

  • destination:日志输出目标(file 或 syslog)
  • logAppend:是否追加到现有日志文件
  • path:日志文件路径
  • logRotate:日志轮转方式(rename 或 reopen)
  • verbosity:日志级别

命令行参数

启动时指定日志位置

bash
# Linux/macOS
mongod --dbpath /data/db --logpath /var/log/mongodb/mongod.log --logappend

# Windows
mongod.exe --dbpath C:\data\db --logpath C:\Program Files\MongoDB\Server\6.0\log\mongod.log --logappend

日志级别设置

bash
# 设置详细日志级别
mongod --dbpath /data/db --logpath /var/log/mongodb/mongod.log --v 2

# 安静模式,只记录严重错误
mongod --dbpath /data/db --logpath /var/log/mongodb/mongod.log --quiet

系统日志

系统日志内容

启动信息

2023-01-01T12:00:00.000+0000 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2023-01-01T12:00:00.000+0000 I CONTROL  [initandlisten] MongoDB starting : pid=12345 port=27017 dbpath=/data/db 64-bit host=mongodb-server
2023-01-01T12:00:00.000+0000 I CONTROL  [initandlisten] db version v6.0.0
2023-01-01T12:00:00.000+0000 I CONTROL  [initandlisten] git version: xxxxxxxx
2023-01-01T12:00:00.000+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.1.1f  31 Mar 2020

连接信息

2023-01-01T12:01:00.000+0000 I NETWORK  [listener] Listening on 0.0.0.0
2023-01-01T12:01:00.000+0000 I NETWORK  [listener] waiting for connections on port 27017
2023-01-01T12:02:00.000+0000 I NETWORK  [conn1] received client metadata from 127.0.0.1:12345 conn1: { application: { name: "MongoDB Shell" }, driver: { name: "MongoDB Internal Client", version: "6.0.0" }, os: { type: "Linux", name: "Ubuntu", version: "20.04" } }

错误信息

2023-01-01T12:03:00.000+0000 E STORAGE  [journal] Insufficient free space for journal files
2023-01-01T12:03:00.000+0000 I STORAGE  [journal] please make at least 3379MB available in /data/db/journal or use --smallfiles
2023-01-01T12:03:00.000+0000 I STORAGE  [journal] 
2023-01-01T12:03:00.000+0000 E STORAGE  [initandlisten] Failed to set up journal dir: /data/db/journal
2023-01-01T12:03:00.000+0000 I STORAGE  [initandlisten] exception in initAndListen: Location28596: Failed to set up journal dir: /data/db/journal, terminating

审计日志配置

审计日志启用

配置文件方式

yaml
auditLog:
  destination: file
  format: BSON
  path: /var/log/mongodb/audit.log
  filter: '{ "atype": "authCheck" }'  # 可选,只记录认证检查

命令行方式

bash
mongod --dbpath /data/db \
  --auditDestination file \
  --auditFormat BSON \
  --auditPath /var/log/mongodb/audit.log

审计日志格式

BSON 格式

  • 二进制 JSON 格式
  • 支持高效查询和分析
  • 适合大型审计日志
  • 可使用 mongosh 查询

JSON 格式

  • 人类可读的 JSON 格式
  • 适合手动查看和简单分析
  • 支持文本处理工具
  • 示例:
    json
    { "atype": "authCheck", "ts": { "$date": "2023-01-01T12:00:00.000Z" }, "local": { "ip": "127.0.0.1", "port": 27017 }, "remote": { "ip": "127.0.0.1", "port": 12345 }, "users": [], "roles": [], "param": { "command": "insert", "ns": "test.users" }, "result": 0 }

Syslog 格式

  • 输出到系统日志
  • 适合集成到现有日志管理系统
  • 支持 syslog 设施和级别

审计日志过滤

过滤规则

  • 只记录特定类型的操作
  • 减少日志体积和性能开销
  • 支持 JSON 查询语法

示例过滤规则

yaml
# 只记录认证和授权操作
auditLog:
  filter: '{ "atype": { "$in": ["authCheck", "authStart"] } }'

# 只记录特定数据库的操作
auditLog:
  filter: '{ "param.ns": /^mydb\./ }'

# 只记录失败的操作
auditLog:
  filter: '{ "result": { "$ne": 0 } }'

慢查询日志配置

慢查询日志启用

配置文件方式

yaml
operationProfiling:
  slowOpThresholdMs: 100  # 慢查询阈值,单位毫秒
  mode: slowOp  # 只记录慢查询
  # 或 mode: all  # 记录所有操作

命令行方式

bash
mongod --dbpath /data/db \
  --slowms 100 \
  --profile 1  # 1: 只记录慢查询,2: 记录所有操作

慢查询日志查看

使用 db.currentOp()

javascript
// 查看当前正在执行的慢查询
db.currentOp({ "active": true, "secs_running": { "$gt": 1 } })

使用 db.system.profile 集合

javascript
// 查看最近的慢查询
db.system.profile.find().sort({ ts: -1 }).limit(10)

// 查看特定集合的慢查询
db.system.profile.find({ "ns": "test.users" }).sort({ ts: -1 })

// 查看执行时间超过 200ms 的查询
db.system.profile.find({ "millis": { "$gt": 200 } }).sort({ ts: -1 })

慢查询日志分析

关键指标

  • millis:查询执行时间(毫秒)
  • docsExamined:扫描的文档数
  • nreturned:返回的文档数
  • indexBounds:使用的索引范围
  • planSummary:查询计划摘要

优化建议

  • 为频繁查询的字段创建索引
  • 优化查询语句,减少扫描文档数
  • 考虑使用覆盖索引
  • 调整查询逻辑,减少返回文档数

日志轮转与管理

日志轮转配置

rename 方式

  • 默认的日志轮转方式
  • MongoDB 关闭当前日志文件,重命名为 filename.0,然后创建新的日志文件
  • 需要外部工具配合(如 logrotate)

reopen 方式

  • MongoDB 关闭并重新打开日志文件
  • 适合配合外部日志轮转工具
  • 配置示例:
    yaml

systemLog: logRotate: reopen


### Linux logrotate 配置

**配置文件示例**:

/var/log/mongodb/mongod.log { daily rotate 7 compress delaycompress missingok notifempty create 0640 mongodb mongodb postrotate /bin/kill -SIGUSR1 $(cat /var/run/mongodb/mongod.pid 2>/dev/null) 2>/dev/null || true endscript }


**配置说明**:
- `daily`:每天轮转一次
- `rotate 7`:保留 7 天的日志
- `compress`:压缩旧日志
- `delaycompress`:延迟压缩,只压缩前一天的日志
- `create 0640 mongodb mongodb`:创建新日志文件,权限为 0640,所有者为 mongodb:mongodb
- `postrotate`:轮转后执行的命令,发送 SIGUSR1 信号通知 MongoDB 重新打开日志文件

### 日志清理策略

**定期清理**:
- 结合 logrotate 配置,自动清理过期日志
- 保留足够的日志用于故障诊断
- 根据磁盘空间和合规要求调整保留时间

**集中管理**:
- 使用日志管理系统(如 ELK Stack、Splunk)
- 实现日志的集中存储和分析
- 支持日志搜索、告警和可视化
- 提高日志管理效率

## 日志监控与分析

### 日志监控工具

**mongostat**:
- 监控 MongoDB 实例的实时性能指标
- 包含操作数、延迟、连接数等
- 支持按时间间隔输出数据
- 示例:`mongostat --host localhost:27017 --discover`

**mongotop**:
- 监控集合级别的读写情况
- 帮助识别热点集合
- 支持实时监控
- 示例:`mongotop --host localhost:27017 --sleep 1`

**MongoDB Atlas**:
- 提供日志监控和告警功能
- 支持日志搜索和分析
- 可视化展示日志数据
- 适合云部署的 MongoDB

### 日志分析方法

**错误日志分析**:
- 搜索关键字如 "error"、"exception"、"failed"
- 分析错误发生的时间和频率
- 关联错误与系统事件
- 制定相应的修复措施

**性能日志分析**:
- 分析慢查询日志,识别性能瓶颈
- 监控查询执行时间的变化趋势
- 分析索引使用情况
- 优化查询和索引

**安全日志分析**:
- 监控异常登录尝试
- 分析权限变更
- 检测可疑操作
- 确保合规性要求

## 常见问题(FAQ)

### Q1: 如何查看 MongoDB 的日志文件?

A1: 可以通过以下方式查看:
- 使用 `tail -f` 命令实时查看:`tail -f /var/log/mongodb/mongod.log`
- 使用 `mongosh` 连接到 MongoDB,执行 `show logs` 查看日志文件列表,然后使用 `db.adminCommand({ getLog: "file" })` 查看日志内容
- 在 MongoDB Atlas 中,通过 "Logs" 选项卡查看

### Q2: 如何调整 MongoDB 的日志级别?

A2: 可以通过以下方式调整:
- 在配置文件中设置 `verbosity` 参数
- 启动时使用 `--v`、`--vv` 等命令行参数
- 运行时使用 `db.adminCommand({ setParameter: 1, logLevel: 2 })` 动态调整

### Q3: 审计日志会影响 MongoDB 的性能吗?

A3: 是的,审计日志会带来一定的性能开销,具体取决于:
- 审计日志的格式(BSON 比 JSON 性能更好)
- 审计日志的过滤规则(过滤后的日志越少,性能开销越小)
- 系统的硬件配置
建议根据实际需求配置审计日志,避免不必要的性能开销。

### Q4: 如何设置慢查询阈值?

A4: 可以通过以下方式设置:
- 在配置文件中设置 `slowOpThresholdMs` 参数
- 启动时使用 `--slowms` 命令行参数
- 运行时使用 `db.setProfilingLevel(1, 200)` 动态调整(200 为慢查询阈值,单位毫秒)

### Q5: 如何管理 MongoDB 的日志文件大小?

A5: 可以通过以下方式管理:
- 配置 logrotate,自动轮转和压缩日志文件
- 调整日志级别,减少日志输出量
- 使用日志过滤规则,只记录必要的日志
- 定期清理过期日志文件

### Q6: 如何将 MongoDB 日志发送到 syslog?

A6: 可以通过以下方式配置:
```yaml
systemLog:
  destination: syslog
  syslogFacility: local0
  logAppend: true

或使用命令行参数:

bash
mongod --dbpath /data/db --syslog --syslogFacility local0

Q7: 如何查看副本集的日志?

A7: 副本集的日志包含额外的复制和选举信息:

  • 主节点日志包含写操作和复制信息
  • 从节点日志包含复制和同步信息
  • 使用 --replSet 参数启动时,日志会包含副本集相关信息
  • 可以通过 rs.status() 查看副本集状态,结合日志分析复制问题

Q8: 如何分析 MongoDB 的慢查询日志?

A8: 分析慢查询日志的步骤:

  1. 查看慢查询日志,识别执行时间长的查询
  2. 分析查询的 docsExaminednreturned,判断是否存在全表扫描
  3. 检查 indexBounds,确认是否使用了合适的索引
  4. 根据 planSummary 优化查询计划
  5. 实施优化措施,如创建索引、调整查询语句
  6. 验证优化效果,比较优化前后的执行时间