如何设置MongoDB审计日志功能,导出用户操作记录至文件?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1006个文字,预计阅读时间需要5分钟。
社区版+mongod+不支持+auditLog+配置了也静默认忽略,不报错也不写日志。必须是+Enterprise+版(含阿里云/腾讯云等托管的商业版实例)才真正生效。验证方式有两个:
- 运行
mongod --version,输出中必须含enterprise字样 - 连上数据库执行
db.runCommand({getCmdLineOpts: 1}),返回结果里要有auditLog字段(社区版返回里压根没有这个 key)
注意:在 ECS 上手动装企业版、改本地 /etc/mongod.conf,但连接的是云厂商的实例地址 → 审计日志仍不会产生,因为实际 mongod 进程不在你本地。
auditLog 配置项必须写对格式和路径权限
配置写在 /etc/mongod.conf(或你的实际配置路径)里,YAML 格式敏感,缩进、大小写、冒号后空格都不能错。常见错误包括:
-
auditLog顶格写,下面子字段必须缩进 2 空格(不是 tab) -
path指向的目录(如/var/log/mongodb/)必须存在,且mongod进程用户(通常是mongodb)有写权限 -
filter是 JSON 字符串,必须用单引号包裹,且内部双引号不能省;例如:filter: '{ "atype": { "$ne": "authenticate" } }' -
format只能是JSON或BSON,大小写严格,写成json会启动失败
正确示例片段:
auditLog: destination: file format: JSON path: /var/log/mongodb/audit.json filter: '{ "atype": { "$in": ["create", "drop", "insert", "update", "delete"] } }'
云托管实例(如阿里云 MongoDB)不能直接改 mongod.conf
你在控制台看到的实例,其 mongod 进程由云平台统一管理,本地配置文件修改无效。开启审计必须走平台通道:
- 阿里云:进入「云数据库 MongoDB 版」控制台 → 实例详情页 → 「正式版审计日志」→ 「开通审计日志」
- 腾讯云:通过「数据库审计」功能开关,或调用 DAS OpenAPI 的
EnableAuditRule - 开通前需确保已开通 SLS(日志服务),并授予 RAM 用户
AliyunLogFullAccess和自定义策略dds:CheckServiceLinkedRole
云环境下的 filter 通常通过控制台“审计过滤器构建器”图形化设置,不接触 YAML;若用 API,则传入的是 JSON 字符串,不是配置文件语法。
读取和排查 audit.json 日志时容易卡住的点
日志是纯文本 JSON 行格式(每行一个 JSON 对象),不能直接用 cat 或编辑器打开大文件。常见问题:
- 用
tail -n 100 /var/log/mongodb/audit.json查最新事件,别直接less整个文件(可能几百 MB) - 想结构化分析?用
jq:例如jq 'select(.atype == "insert") | .ts, .local.host, .param.ns' /var/log/mongodb/audit.json - 如果日志为空,先确认
mongod是否真以该配置启动:ps aux | grep mongod看命令行是否带--config /etc/mongod.conf - 日志写入失败时,
mongod启动会报错(如 permission denied),但一旦启动成功,后续写入失败默认静默丢弃 —— 所以务必提前验证路径可写
最常被忽略的是:filter 里用了 $regex 或嵌套太深的查询,会导致匹配逻辑失效,看起来像“没记录”,其实是被过滤掉了;上线前用简单 { "atype": "insert" } 先验证通路。
本文共计1006个文字,预计阅读时间需要5分钟。
社区版+mongod+不支持+auditLog+配置了也静默认忽略,不报错也不写日志。必须是+Enterprise+版(含阿里云/腾讯云等托管的商业版实例)才真正生效。验证方式有两个:
- 运行
mongod --version,输出中必须含enterprise字样 - 连上数据库执行
db.runCommand({getCmdLineOpts: 1}),返回结果里要有auditLog字段(社区版返回里压根没有这个 key)
注意:在 ECS 上手动装企业版、改本地 /etc/mongod.conf,但连接的是云厂商的实例地址 → 审计日志仍不会产生,因为实际 mongod 进程不在你本地。
auditLog 配置项必须写对格式和路径权限
配置写在 /etc/mongod.conf(或你的实际配置路径)里,YAML 格式敏感,缩进、大小写、冒号后空格都不能错。常见错误包括:
-
auditLog顶格写,下面子字段必须缩进 2 空格(不是 tab) -
path指向的目录(如/var/log/mongodb/)必须存在,且mongod进程用户(通常是mongodb)有写权限 -
filter是 JSON 字符串,必须用单引号包裹,且内部双引号不能省;例如:filter: '{ "atype": { "$ne": "authenticate" } }' -
format只能是JSON或BSON,大小写严格,写成json会启动失败
正确示例片段:
auditLog: destination: file format: JSON path: /var/log/mongodb/audit.json filter: '{ "atype": { "$in": ["create", "drop", "insert", "update", "delete"] } }'
云托管实例(如阿里云 MongoDB)不能直接改 mongod.conf
你在控制台看到的实例,其 mongod 进程由云平台统一管理,本地配置文件修改无效。开启审计必须走平台通道:
- 阿里云:进入「云数据库 MongoDB 版」控制台 → 实例详情页 → 「正式版审计日志」→ 「开通审计日志」
- 腾讯云:通过「数据库审计」功能开关,或调用 DAS OpenAPI 的
EnableAuditRule - 开通前需确保已开通 SLS(日志服务),并授予 RAM 用户
AliyunLogFullAccess和自定义策略dds:CheckServiceLinkedRole
云环境下的 filter 通常通过控制台“审计过滤器构建器”图形化设置,不接触 YAML;若用 API,则传入的是 JSON 字符串,不是配置文件语法。
读取和排查 audit.json 日志时容易卡住的点
日志是纯文本 JSON 行格式(每行一个 JSON 对象),不能直接用 cat 或编辑器打开大文件。常见问题:
- 用
tail -n 100 /var/log/mongodb/audit.json查最新事件,别直接less整个文件(可能几百 MB) - 想结构化分析?用
jq:例如jq 'select(.atype == "insert") | .ts, .local.host, .param.ns' /var/log/mongodb/audit.json - 如果日志为空,先确认
mongod是否真以该配置启动:ps aux | grep mongod看命令行是否带--config /etc/mongod.conf - 日志写入失败时,
mongod启动会报错(如 permission denied),但一旦启动成功,后续写入失败默认静默丢弃 —— 所以务必提前验证路径可写
最常被忽略的是:filter 里用了 $regex 或嵌套太深的查询,会导致匹配逻辑失效,看起来像“没记录”,其实是被过滤掉了;上线前用简单 { "atype": "insert" } 先验证通路。

