必须显式设置 accesscontrol 组件日志级别,因默认 verbosity 为 -1,全局 db.setloglevel(2) 不影响该组件;需执行 db.setloglevel(1, "accesscontrol") 或在配置文件中配置 systemlog.component.accesscontrol.verbosity: 1。

想让 MongoDB 记录详细的用户认证日志,必须单独设置 accessControl 组件的级别,全局 verbosity 不会自动生效。
为什么 db.setLogLevel(2) 不会输出认证失败详情
MongoDB 的日志是分组件控制的。即使你把全局日志级别设为 2,accessControl 组件默认仍继承 -1(即“不记录”),所以登录失败、权限拒绝等事件根本不会写入日志。
-
db.getLogComponents()返回中"accessControl":{"verbosity":-1}是关键线索 - 全局
verbosity: 2只影响未显式覆盖的组件(如query、network) -
accessControl必须被显式设置,否则永远静默
如何用 db.setLogLevel() 动态开启认证日志
连接到 MongoDB 实例后,直接运行命令即可立即生效(无需重启):
db.setLogLevel(1, "accessControl")
- 第一个参数
1表示该组件的日志详细程度(0=仅错误,1=含警告和基础认证事件) - 第二个参数
"accessControl"是组件名,必须拼写完全一致,区分大小写 - 若要同时开启慢查询和认证日志,需分别调用:
db.setLogLevel(2, "query")和db.setLogLevel(1, "accessControl") - 该设置在实例重启后失效,仅适合临时排查
如何在配置文件中永久启用认证日志
编辑 /etc/mongod.conf(Linux)或 mongod.cfg(Windows),在 systemLog 下添加组件级配置:
systemLog:
verbosity: 0
component:
accessControl:
verbosity: 1
network:
verbosity: 0
-
systemLog.component.accessControl.verbosity是完整路径,不能简写为accessControl.verbosity - 建议全局
verbosity保持0,只对必要组件提级,避免日志爆炸 - 修改后必须执行
sudo systemctl restart mongod(Linux)或服务重启(Windows)才生效 - 注意 YAML 缩进:
component和accessControl必须对齐,否则启动失败并报错Failed to parse YAML config file
验证是否生效及常见陷阱
执行 db.getLogComponents() 后检查返回值中 accessControl 的 verbosity 是否已变为 1;再尝试用错误密码登录,观察日志文件中是否出现类似以下内容:
Access control: Unauthorized: not authorized on admin to execute command { authenticate: 1, ... }
- 日志路径由
systemLog.path指定,若未设置且destination: file,默认可能写入/var/log/mongodb/mongod.log - 如果启用了
logAppend: true但日志文件权限不对(如 mongod 用户无写入权),会导致日志静默丢失 - 审计(audit)功能是商业版特性,
accessControl日志 ≠ 审计日志,它不记录具体操作文档内容,只记录授权结果
真正难的不是找到配置项,而是意识到 MongoDB 默认把认证日志关得死死的——连登录失败都不记,除非你亲手把它打开,并且确认缩进、路径、权限三者全部正确。











