MongoDB社区版不支持审计日志,仅企业版(含阿里云等托管企业版)内置该功能;配置需严格遵循路径权限、JSON格式大小写及filter字符串语法,云环境须通过控制台或DAS API开启。

审计日志只在企业版可用,社区版无法开启
直接说结论:如果你用的是 MongoDB Community Edition,无论怎么改配置、重启服务,auditLog 都不会生效——它压根没编译进二进制里。只有 Enterprise Edition(含云厂商托管版如阿里云 MongoDB 企业版实例)才内置审计能力。很多团队踩坑就在这儿:查了一堆文档配了 auditLog.destination: file,结果日志文件始终为空,连错误都不报。
验证方法很简单:mongod --version 看输出是否带 enterprise 字样;或者连上数据库执行 db.runCommand({getCmdLineOpts: 1}),检查返回中是否有 auditLog 相关字段(社区版会直接忽略该配置,不报错也不加载)。
配置 auditLog 必须写对路径、格式和 filter
企业版开启审计不是加一行就完事。最常出问题的是三处:路径权限、JSON 格式硬性要求、filter 写法不匹配事件类型。
-
auditLog.path指定的目录(比如/var/log/mongodb/)必须由mongod进程用户(通常是mongod或mongodb)有写权限,否则启动失败且日志里只报模糊的Failed to open audit log file -
auditLog.format只支持JSON或BSON,不能写成json或Json——大小写敏感,写错会导致服务拒绝启动 -
auditLog.filter是 JSON 字符串,不是 JS 对象,必须用单引号包裹整个 filter,且内部双引号不能省:正确写法是filter: '{ "atype": { "$in": ["authCheck", "insert"] } }';写成filter: { atype: { $in: ["authCheck"] } }会直接解析失败
推荐最小可用配置(存为 /etc/mongod.conf):
auditLog:
destination: file
path: /var/log/mongodb/audit.json
format: JSON
filter: '{ "atype": { "$ne": "authenticate" } }'
这个 filter 排除了高频但低价值的登录事件,避免日志爆炸。
云环境(如阿里云)要走控制台或 DAS API,不认本地配置
如果你用的是阿里云、腾讯云等托管 MongoDB 实例,auditLog 配置项在实例本地 mongod.conf 里写死也没用——云平台接管了审计开关,所有配置必须通过控制台或 DAS(Data Management Service)OpenAPI 控制。
常见误区:
- 在 ECS 上手动装企业版并改配置,但连接的是云数据库地址 → 审计日志仍不会产生,因为实际 mongod 进程在云厂商机房,不受你本地配置影响
- 调用旧版 MongoDB OpenAPI(如
DescribeAuditRecords)发现返回空 → 实际是新版已切换到 DAS 体系,必须用DAS命名空间下的接口,比如DescribeAuditLogConfig - RAM 用户开通审计失败 → 缺少
AliyunLogFullAccess和自定义策略dds:CheckServiceLinkedRole,缺一不可
审计日志不是“全量记录”,filter 不当会导致关键操作漏掉
默认不设 filter 时,企业版会记录大量低价值事件(比如每次 isMaster 心跳、驱动自动重连),迅速撑爆磁盘。但 filter 写太严又容易漏掉真正要追踪的行为。
典型场景建议:
- 排查越权访问:保留
"atype": "authCheck"+"param.db"匹配目标库名 - 跟踪删库删表:必须显式包含
"dropDatabase"、"dropCollection"、"collMod"(可能改集合权限) - 监控高危命令:注意
"createUser"、"updateUser"、"grantRolesToUser"都属于atype: "auth"类型,不是"authCheck"
一个易忽略点:filter 对字段路径敏感。比如想抓所有 delete 操作,不能只写 "atype": "remove"(旧协议名),而要看实际日志中是 "atype": "delete"(新协议),这取决于驱动版本和 wire protocol 版本。
上线前务必用真实操作触发几条日志,用 jq -r '.atype' /var/log/mongodb/audit.json | sort -u 看看实际产生的 atype 值是什么,再反推 filter 怎么写。










