MongoDB 如何记录所有查询或慢查询日志?

MongoDB 通过 profiler 记录慢查询:mongod.conf 中配置 operationProfiling mode 为 slowOp(记慢查询)或 all(记全部),slowOpThresholdMs 设阈值。本文给出配置方法和分析命令。

最佳实践
MongoDB 如何记录所有查询或慢查询日志?封面

在 mongod.conf 中配置 operationProfiling: mode: slowOp, slowOpThresholdMs: 100——超过 100ms 的查询记入日志和 system.profile 集合;mode: all 记录所有查询(生产环境慎用,有性能开销)。

配置文件方式

# /etc/mongod.conf
systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true

operationProfiling:
  mode: slowOp
  slowOpThresholdMs: 100   # 慢查询阈值,单位毫秒

改完重启 mongod 生效。

运行时动态调整(不重启)

// 在 mongo shell 中对特定数据库设置
use mydb
db.setProfilingLevel(1, { slowms: 100 })   // 1 = 只记慢查询
// db.setProfilingLevel(2)                 // 2 = 记所有操作
// db.setProfilingLevel(0)                 // 0 = 关闭

查看记录的内容

慢查询会同时写入两个地方:

  1. 日志文件:mongod.log 中出现 Slow query 或带耗时信息的条目;
  2. system.profile 集合
db.system.profile.find().sort({ ts: -1 }).limit(5).pretty()

常用分析命令

// 最慢的 10 个查询
db.system.profile.find().sort({ millis: -1 }).limit(10)

// 按操作类型统计
db.system.profile.aggregate([
  { $group: { _id: "$op", count: { $sum: 1 } } }
])

观测云对照

观测云提供 MongoDB 集成,可采集慢查询日志和性能指标,在监控视图中统一查看慢查询趋势、TOP 慢查询,并配置告警(如慢查询数量突增时通知),不用登到每台 MongoDB 实例上翻日志。

常见问题(FAQ)

Q:mode: all 对性能影响多大?
A:每个操作都要写入 system.profile(capped collection),高并发下有可感知的开销。生产环境建议只用 slowOp,all 模式仅短期排查问题时开启。

Q:slowOpThresholdMs 设多少合适?
A:取决于业务。OLTP 场景常用 100ms;分析型查询多的系统可以放宽到 1000ms。先设宽松值观察分布再收紧。

Q:system.profile 会无限增长吗?
A:不会。它是 capped collection,默认 1MB,写满后自动覆盖最旧记录。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台