MongoDB 如何记录所有查询或慢查询日志?
MongoDB 通过 profiler 记录慢查询:mongod.conf 中配置 operationProfiling mode 为 slowOp(记慢查询)或 all(记全部),slowOpThresholdMs 设阈值。本文给出配置方法和分析命令。
在 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 = 关闭
查看记录的内容
慢查询会同时写入两个地方:
- 日志文件:mongod.log 中出现
Slow query或带耗时信息的条目; - 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,写满后自动覆盖最旧记录。