MongoDB 5.0+ 副本集从节点默认不记录 DDL 操作(除 local 和 system.profile),仅主节点可靠捕获全部 DDL;auditLog 必须在 mongod.conf 顶层配置,指定 JSON 格式文件路径及 auditFilter 精确匹配 ddl 相关事件,重启后执行 db.createCollection 并用 jq 验证日志输出。

必须在主节点的 mongod.conf 中显式配置 auditLog,且 auditAuthorizationSuccess 不影响 DDL 记录——但副本集从节点在 5.0+ 版本中默认不记录 DDL(除对 local 和 system.profile 的操作)。
确认 MongoDB 版本与审计支持范围
审计功能从 MongoDB 3.2 起可用,但 DDL 日志行为在 5.0 发生关键变更:从节点不再记录绝大多数 DDL 事件(如 createCollection、createIndex)。只有主节点能可靠捕获全部 DDL 操作。
- 检查版本:
mongod --version - 若为 5.0+,不要依赖从节点日志验证 DDL 审计是否生效
- 对
local库或system.profile集合的 DDL 操作仍会在所有节点记录,属例外情况
在 mongod.conf 中正确添加 auditLog 配置块
auditLog 是顶层配置项,不能嵌套在 security 或 systemLog 下;否则启动失败且报错 Failed to open audit log file 或静默忽略。
- 确保路径存在且
mongod用户有写权限:sudo mkdir -p /var/log/mongodb && sudo chown mongodb:mongodb /var/log/mongodb - 推荐使用 JSON 格式便于解析:
format: JSON - destination 必须明确指定:
file或syslog,不支持console - 示例有效配置段:
auditLog: destination: file format: JSON path: /var/log/mongodb/audit.log
用 auditFilter 精准捕获 DDL 类型事件
默认开启 auditLog 后,DDL 操作(如建库、建集合、建索引、删集合)会自动记录,无需 auditAuthorizationSuccess: true ——该参数只影响 DML(insert/update/delete/find)是否被记录。
- 若只想记录 DDL,过滤器设为:
{"atype": {"$regex": "^ddl$|^create|drop|alter|rename|collMod$"}} - 更稳妥的写法(兼容各版本):
{"atype": {"$in": ["createCollection", "dropCollection", "createIndex", "dropIndex", "dropDatabase"]}} - filter 值需为合法 JSON 字符串,填入配置时要转义双引号(YAML 中可直接写单引号包裹)
- 注意:
auditFilter字段名是filter,完整路径是auditLog.filter
重启后验证 DDL 审计是否真正生效
配置修改后必须重启 mongod 进程,审计不会热加载。仅查看日志文件是否生成不够,要确认内容是否含 DDL 事件。
- 执行一条 DDL 操作:
db.createCollection("test_audit") - 立即检查日志:
tail -n 20 /var/log/mongodb/audit.log | jq '.'(需安装jq) - 应看到类似:
{"atype":"createCollection","ts":{"$date":"2026-09-07T20:43:00.123Z"},"user":"admin@admin","db":"test","collection":"test_audit"} - 若无输出,先运行
db.runCommand({getAuditLog: 1})——返回空数组说明审计未启用,重点检查配置位置和语法
最容易被忽略的是:以为配置完就能在所有副本集节点看到 DDL 日志,实际只有主节点可靠输出;另外,auditFilter 写错格式(比如漏掉外层大括号、用错引号)会导致整个 auditLog 加载失败,mongod 启动时不会报错,但日志完全静默。











