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 重新打开日志;reopen 要求 logAppend=true,旧日志保留和压缩需另行配置。
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 检索某类事件,不是每次发生都唯一的事件 ID;
- attr:结构化属性体(慢查询可能含 durationMillis、planSummary、nreturned 等,具体字段依事件与版本而异)。
集中分析 mongod.log 时,先用一条真实日志验证字段。通过观测云 DataKit 日志采集读取文件后,配置 JSON 解析,将 s 映射为日志级别、t.$date 解析为事件时间,并保留 c、ctx 和需要查询的 attr 子字段。确认慢查询的耗时与命名空间可检索后,再按实例和时间窗口统计;Profiler 集合里的记录需要另行读取,不能当作 mongod.log 自动采到。
3. 慢查询与 Profiler
// 在目标 mongod 数据库上记录原设置,并短期启用采样
const previous = db.getProfilingStatus();
db.setProfilingLevel(1, { slowms: 100, sampleRate: 0.1, filter: "unset" })
// 查看分析结果
db.system.profile.find().sort({ ts: -1 }).limit(5).pretty()
system.profile 集合记录慢操作的执行计划摘要、扫描/返回行数、耗时。级别 2 记全部操作(仅短期排障),0 关闭该数据库 profiler,但不一定关闭诊断日志的慢操作记录。profile 级别按数据库设置,slowms/sampleRate 是进程级;配置 filter 后它会覆盖阈值与采样选择。MongoDB 8.0+ 慢操作阈值使用 workingMillis,并非总耗时 durationMillis。慢操作也可能出现在主日志(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 |
非正常关机后的恢复 |
常见问题(FAQ)
老版本 MongoDB(4.4 之前)的文本日志怎么解析?
4.2 及更早是纯文本格式(时间戳 级别 组件 [线程] 消息)。用 Pipeline 的 grok 规则解析,或规划升级到受支持版本;升级需遵守版本跳转、兼容性与回退要求,不能只为日志格式直接跨版本升级。
Profiler 开着有性能影响吗?
级别 1 也会写 system.profile,开销取决于负载、阈值和采样,不能一概认为影响很小。短期启用并监测,结束后恢复原 level、slowms、sampleRate 及 filter(无原 filter 时用 "unset");运行时配置不等于持久配置。级别 2 记录全部操作,尤其需控制范围。
mongos 和 mongod 日志要分开采吗?
要;mongos 不提供数据库 profiler,但仍有诊断慢操作日志。分片集群中 mongos(路由)、config server、shard mongod 的日志各自独立,DataKit 配置中用不同 source 或自定义字段区分角色,排障时按角色过滤。
副本集选主期间日志怎么看?
REPL 组件会记录选举全过程(Starting an election、Transition to primary)。集中检索时按解析后的组件字段筛选 REPL,再核对各实例的角色变化时间;若要对频繁选举告警,需先明确统计事件及检测窗口。
系列阅读
- 上一篇:Redis 日志详解
- 下一篇:Docker 日志策略与最佳实践
- 相关阅读:PostgreSQL 日志详解 | 什么是日志聚合