MongoDB 日志详解:systemLog 配置、慢查询与分析实战
MongoDB 日志中文详解:systemLog 配置(destination/path/logAppend/logRotate)、4.4+ 结构化 JSON 日志格式、verbosity 日志详略、数据库 Profiler 慢查询(slowms)、logRotate 轮转,以及观测云 DataKit 采集告警落地方案。
MongoDB 从 4.4 起把日志全面改为结构化 JSON 格式——每条日志都是带严重级别、组件、上下文的标准文档,天然适合平台化采集分析。本文讲解 systemLog 配置、日志结构解读、Profiler 慢查询诊断,以及观测云落地路径。
核心要点速览
- MongoDB 4.4+ 日志默认就是 JSON:每条含 severity(F/E/W/I/D1-D5)、component(COMMAND/STORAGE/NETWORK 等)、msg、attr 属性体。
- systemLog 段落管输出去向:文件/syslog/控制台,logAppend 追加、logRotate 轮转。
- Profiler 是慢查询主武器:
profile级别 +slowms阈值,结果存 system.profile 集合。 - 组件级 verbosity 精细调噪:STORAGE 太吵就单独调低,COMMAND 排障就单独调高。
1. systemLog 基础配置
# mongod.conf
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true # 重启追加而非覆盖
logRotate: reopen # 支持外部 logrotate 的 reopen 模式
verbosity: 0 # 全局详略 0-5
component:
command:
verbosity: 1 # COMMAND 组件单独调详细
logRotate: reopen 配合系统 logrotate(发 SIGUSR1 或执行 db.adminCommand({logRotate: 1}))实现安全轮转——MongoDB 收到信号后重新打开日志文件。
2. 读懂 JSON 日志结构
{
"t": {"$date": "2026-08-25T14:55:22.123+08:00"},
"s": "I",
"c": "NETWORK",
"id": 22943,
"ctx": "listener",
"msg": "Connection accepted",
"attr": {"remote": "10.0.0.8:51234", "connectionCount": 42}
}
- s(severity):F Fatal、E Error、W Warning、I Info、D1-D5 调试详略;
- c(component):ACCESS(访问控制)、COMMAND、CONTROL、NETWORK、QUERY、REPL(复制)、SHARDING、STORAGE、WT(WiredTiger)等;
- id:唯一消息 ID,可直接按 ID 检索某类事件;
- attr:结构化属性体(慢查询的 durationMillis、planSummary、nreturned 都在这里)。
3. 慢查询与 Profiler
// 开启 profiling(级别 1 = 只记慢操作)
db.setProfilingLevel(1, { slowms: 100 })
// 查看分析结果
db.system.profile.find().sort({ ts: -1 }).limit(5).pretty()
system.profile 集合记录慢操作的执行计划摘要、扫描/返回行数、耗时。级别 2 记全部操作(仅短期排障),0 关闭。慢操作同样会出现在主日志(COMMAND 组件、msg 为 Slow query),两种视角互为补充。
4. 值得关注的关键日志模式
| 日志信号 | 含义 |
|---|---|
Slow query(attr.durationMillis 大) |
慢操作,看 planSummary 是否 COLLSCAN |
Connection accepted 频率异常 |
短连接风暴,检查连接池 |
REPL 组件的 Rollback / state transition |
复制集角色切换、回滚 |
WT 组件的 cache is full 类 |
WiredTiger 缓存压力,内存告急 |
Detected unclean shutdown |
非正常关机后的恢复 |
观测云落地:MongoDB 日志采集与分析
- 采集:DataKit
conf.d/log/logging.conf的logfiles指向 mongod.log,source: mongodb、service标识实例;JSON 日志自动解析,severity/component/attr 直接成为可过滤字段。 - 标准化:severity(F/E/W →
error/warning)映射标准status,t.$date解析为time。 - 告警:监控器对 Fatal/Error、复制集角色切换、慢查询速率(每分钟 Slow query 条数)、连接风暴设规则,通知钉钉/企业微信/飞书。
- 分析:日志查看器按 component/attr.ns(命名空间)聚合慢查询 TopN;聚类分析归纳异常模式;耗时分布入仪表板。
- 成本控制:主日志标准索引;如开启级别 2 profiling 产生大量记录,走低频索引并限时开启。
常见问题(FAQ)
老版本 MongoDB(4.4 之前)的文本日志怎么解析?
4.2 及更早是纯文本格式(时间戳 级别 组件 [线程] 消息)。用 Pipeline 的 grok 规则解析,或优先升级版本——JSON 日志的运维效率提升是质的。
Profiler 开着有性能影响吗?
级别 1(只记慢操作)影响很小,生产可常开;级别 2(全量)会写 system.profile 集合,量大有开销,短期排障用。阈值 slowms 从 100ms 起步按业务调整。
mongos 和 mongod 日志要分开采吗?
要。分片集群中 mongos(路由)、config server、shard mongod 的日志各自独立,DataKit 配置中用不同 source 或自定义字段区分角色,排障时按角色过滤。
副本集选主期间日志怎么看?
REPL 组件会记录选举全过程(Starting an election、Transition to primary)。观测云中按 REPL 组件过滤时间线,配合告警规则"30 分钟内发生多次选举"发现不稳定集群。
系列阅读
- 上一篇:Redis 日志详解
- 下一篇:Docker 日志策略与最佳实践
- 相关阅读:PostgreSQL 日志详解 | 什么是日志聚合