Skip to content

MongoDB 日志配置优化

日志配置基础

1. 日志级别设置

日志级别

  • 0:error - 仅记录错误信息
  • 1:warning - 记录警告和错误信息
  • 2:info - 记录信息、警告和错误信息(默认)
  • 3:verbose - 记录详细信息、信息、警告和错误信息
  • 4:debug - 记录调试信息、详细信息、信息、警告和错误信息
  • 5:trace - 记录跟踪信息、调试信息、详细信息、信息、警告和错误信息

配置方法

命令行参数

bash
mongod --verbose --v 2

配置文件

yaml
systemLog:
  verbosity: 2

运行时修改

javascript
// 连接到 MongoDB
db.adminCommand({ setParameter: 1, logLevel: 2 })

2. 日志输出目标

输出目标

  • 控制台:标准输出,适合开发和测试环境
  • 文件:写入文件,适合生产环境
  • syslog:发送到 syslog 服务

配置方法

输出到文件

yaml
systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true

输出到控制台

yaml
systemLog:
  destination: stdout
  logAppend: true

输出到 syslog

yaml
systemLog:
  destination: syslog
  syslogFacility: local0

3. 日志格式

日志格式

  • 文本格式:默认格式,适合人类阅读
  • JSON 格式:结构化格式,适合日志分析工具处理

配置方法

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

慢查询日志配置

1. 慢查询阈值设置

慢查询阈值

  • 默认为 100 毫秒
  • 可以根据业务需求调整

配置方法

命令行参数

bash
mongod --slowms 200

配置文件

yaml
setParameter:
  slowOpThresholdMs: 200

运行时修改

javascript
db.adminCommand({ setParameter: 1, slowOpThresholdMs: 200 })

2. 慢查询采样率

采样率

  • 默认为 1.0(全部记录)
  • 可以设置为 0.0 到 1.0 之间的值,控制采样比例

配置方法

yaml
setParameter:
  slowOpSampleRate: 0.5

运行时修改

javascript
db.adminCommand({ setParameter: 1, slowOpSampleRate: 0.5 })

3. 慢查询日志内容

慢查询日志包含的信息

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

配置慢查询日志包含的操作类型

yaml
setParameter:
  logSlowOps: true
  logSlowEnqueueOperations: true

日志轮转配置

1. 日志轮转方式

日志轮转方式

  • reopen:使用外部工具(如 logrotate)进行日志轮转,MongoDB 重新打开日志文件
  • rename:MongoDB 自动重命名日志文件,创建新的日志文件

配置方法

使用外部工具轮转

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

MongoDB 自动轮转

yaml
systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true
  logRotate: rename
  rotate: 7
  timeStampFormat: iso8601-utc

2. 使用 logrotate 进行日志轮转

logrotate 配置示例

bash
# /etc/logrotate.d/mongodb
/var/log/mongodb/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 640 mongodb mongodb
    sharedscripts
    postrotate
        /bin/kill -SIGUSR1 $(cat /var/run/mongodb/mongod.pid 2>/dev/null) 2>/dev/null || true
    endscript
}

配置说明

  • daily:每天轮转一次
  • rotate 7:保留 7 天的日志
  • compress:压缩旧日志
  • delaycompress:延迟压缩,保留最新的旧日志不压缩
  • missingok:忽略缺失的日志文件
  • notifempty:仅当日志文件非空时轮转
  • create 640 mongodb mongodb:创建新日志文件,权限为 640,所有者为 mongodb:mongodb
  • sharedscripts:所有日志文件轮转后执行一次脚本
  • postrotate:轮转后执行的脚本,发送 SIGUSR1 信号通知 MongoDB 重新打开日志文件

3. 日志轮转最佳实践

最佳实践

  • 根据磁盘空间和业务需求设置合理的日志保留时间
  • 启用日志压缩,减少磁盘空间占用
  • 使用集中式日志管理系统,便于日志分析和检索
  • 定期清理过期日志,释放磁盘空间

日志性能优化

1. 减少日志对性能的影响

优化措施

  • 适当设置日志级别,避免过于详细的日志
  • 合理设置慢查询阈值,避免记录过多的慢查询
  • 使用日志轮转,避免日志文件过大
  • 将日志文件存储在高速磁盘上
  • 考虑使用 SSD 存储日志文件

2. 日志异步写入

异步写入

  • MongoDB 4.2+ 支持日志异步写入
  • 可以提高写入性能,但可能会丢失部分日志

配置方法

yaml
systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true
  sync: false

3. 日志过滤

日志过滤

  • 可以过滤掉不需要的日志信息
  • 减少日志量,提高性能

配置方法

yaml
setParameter:
  logFilter: '{"component": {"$not": {"$eq": "NETWORK"}}}'

运行时修改

javascript
db.adminCommand({ setParameter: 1, logFilter: '{"component": {"$not": {"$eq": "NETWORK"}}}' })

审计日志配置

1. 启用审计日志

审计日志

  • 记录数据库的访问和操作记录
  • 满足合规要求
  • 支持多种输出格式

配置方法

yaml
auditLog:
  destination: file
  format: JSON
  path: /var/log/mongodb/audit.log
  filter: '{ atype: { $in: ["authCheck", "createUser", "dropUser"] } }'

审计事件类型

  • authCheck:认证检查
  • createUser:创建用户
  • dropUser:删除用户
  • updateUser:更新用户
  • createRole:创建角色
  • dropRole:删除角色
  • grantRolesToUser:授予用户角色
  • revokeRolesFromUser:撤销用户角色
  • dbAuthzDefineRole:定义角色
  • dbAuthzUpdateRole:更新角色
  • dbAuthzDropRole:删除角色

2. 审计日志最佳实践

最佳实践

  • 根据合规要求配置审计事件类型
  • 避免记录过多的审计事件,影响性能
  • 将审计日志存储在安全的位置
  • 定期备份审计日志
  • 使用集中式日志管理系统管理审计日志

日志监控和分析

1. 日志监控工具

常用日志监控工具

  • MongoDB Atlas/Ops Manager:提供内置的日志监控和分析功能
  • Prometheus + Grafana:开源监控解决方案,支持日志监控
  • ELK Stack:Elasticsearch + Logstash + Kibana,用于日志收集、存储和分析
  • Splunk:商业日志管理和分析平台
  • Graylog:开源日志管理平台

2. 日志分析方法

分析方法

  • 实时监控:监控日志中的错误和警告信息
  • 趋势分析:分析日志中的趋势,如慢查询数量的变化
  • 异常检测:检测日志中的异常模式,如突然增加的错误数量
  • 关联分析:关联不同日志文件的信息,排查复杂问题

3. 日志查询示例

查询慢查询

bash
grep -i "slow query" /var/log/mongodb/mongod.log

查询错误信息

bash
grep -i "error" /var/log/mongodb/mongod.log

查询连接信息

bash
grep -i "connection accepted" /var/log/mongodb/mongod.log

查询副本集状态变化

bash
grep -i "replica set" /var/log/mongodb/mongod.log

日志配置最佳实践

1. 生产环境配置建议

系统日志

  • 日志级别设置为 0 或 1,减少日志量
  • 启用日志轮转,保留 7-30 天的日志
  • 使用集中式日志管理系统
  • 将日志文件存储在高速磁盘上

慢查询日志

  • 根据业务需求设置合理的慢查询阈值(如 100-500 毫秒)
  • 启用慢查询采样,减少性能影响
  • 定期分析慢查询日志,优化查询和索引

审计日志

  • 根据合规要求配置审计事件类型
  • 避免记录过多的审计事件
  • 将审计日志存储在安全的位置

2. 开发和测试环境配置建议

系统日志

  • 日志级别设置为 2 或 3,便于调试
  • 输出到控制台,便于实时查看
  • 可以不启用日志轮转

慢查询日志

  • 慢查询阈值设置为较小值(如 50 毫秒)
  • 启用全部慢查询记录
  • 便于开发人员优化查询

3. 日志安全

安全措施

  • 限制日志文件的访问权限(如 640)
  • 将日志文件存储在安全的位置
  • 加密敏感的日志信息
  • 定期备份日志文件
  • 避免在日志中记录敏感信息

4. 日志备份和恢复

备份策略

  • 定期备份日志文件
  • 备份保留时间根据业务需求和合规要求确定
  • 使用可靠的备份存储介质

恢复流程

  • 建立日志恢复流程
  • 定期测试日志恢复
  • 确保备份的日志可以正常恢复

常见问题(FAQ)

Q1: 如何查看 MongoDB 日志?

A1: 查看 MongoDB 日志的方法:

  • 直接查看日志文件:tail -f /var/log/mongodb/mongod.log
  • 使用 MongoDB Shell 命令:db.adminCommand({ getLog: "global" })
  • 使用 MongoDB Atlas/Ops Manager 的日志界面

Q2: 如何配置 MongoDB 慢查询日志?

A2: 配置慢查询日志的步骤:

  1. 设置慢查询阈值:setParameter.slowOpThresholdMs: 100
  2. 启用慢查询日志:setParameter.logSlowOps: true
  3. 可选:设置采样率:setParameter.slowOpSampleRate: 0.5

Q3: 日志级别设置为多少合适?

A3: 日志级别设置建议:

  • 生产环境:0 或 1,只记录错误和警告
  • 开发环境:2 或 3,记录详细信息便于调试
  • 排查问题时:临时提高日志级别到 3 或 4

Q4: 如何减少日志对性能的影响?

A4: 减少日志性能影响的方法:

  • 适当设置日志级别
  • 合理设置慢查询阈值
  • 启用日志采样
  • 使用日志轮转
  • 将日志存储在高速磁盘上
  • 考虑使用异步日志写入

Q5: 如何处理过大的日志文件?

A5: 处理过大日志文件的方法:

  • 启用日志轮转,定期轮转日志文件
  • 压缩旧日志文件
  • 定期清理过期日志
  • 使用集中式日志管理系统,将日志存储在外部系统

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

A6: 分析慢查询日志的方法:

  • 识别执行时间最长的查询
  • 分析查询计划,查看是否使用了索引
  • 优化查询语句,添加必要的索引
  • 考虑调整数据库配置参数
  • 定期分析慢查询日志,持续优化

Q7: 审计日志会影响性能吗?

A7: 审计日志会对性能产生一定影响,影响程度取决于:

  • 审计事件类型的数量
  • 审计日志的输出目标
  • 系统的硬件配置

建议根据实际需求配置审计事件类型,避免记录过多的审计事件。

Q8: 如何集中管理 MongoDB 日志?

A8: 集中管理 MongoDB 日志的方法:

  • 使用 ELK Stack(Elasticsearch + Logstash + Kibana)
  • 使用 Splunk 或 Graylog 等日志管理平台
  • 使用 MongoDB Atlas/Ops Manager 的日志管理功能
  • 配置 syslog,将日志发送到集中式 syslog 服务器