审计日志不支持运行时自动轮转,仅能通过db.adminCommand({logRotate:"audit"})手动触发或配置syslog+logrotate实现;auditLog.destination仅限file或syslog,不可为stdout,且file模式下必须指定path并确保mongodb用户有写权限。

审计日志不支持运行时轮转,必须通过 db.adminCommand({ logRotate: "audit" }) 手动触发,且 auditLog.destination 仅控制输出位置,不决定轮转行为。
auditLog.destination 只能设为 file 或 syslog
该字段在配置文件中定义审计日志写入目标,不能设为 stdout(会报错),也不能留空。常见写法:
-
auditLog.destination: file→ 必须同时指定auditLog.path,路径需 MongoDB 进程有写权限 -
auditLog.destination: syslog→ 日志交由 rsyslog/syslog-ng 管理,轮转由系统日志服务控制(如/etc/rsyslog.d/10-mongodb.conf+logrotate)
错误示例:auditLog.destination: stdout 启动失败,报错 Invalid audit log destination: stdout。
auditLog 不支持 logRotate: reopen 或 logSize 配置
MongoDB 审计日志模块完全不识别 systemLog.logRotate、logSize、logSizeMax 等参数。即使你在配置里写了:
auditLog: destination: file path: /var/log/mongodb/audit.log logRotate: reopen # ← 这行被忽略,无任何效果
实际仍只会追加写入,直到磁盘满或手动干预。审计日志没有内置按大小/时间自动切分能力。
真正有效的轮转方式只有两种
必须配合外部机制或手动命令:
-
手动触发:在
mongosh中执行db.adminCommand({ logRotate: "audit" }),MongoDB 将当前审计日志重命名为audit.log.<utc-timestamp></utc-timestamp>,新建空audit.log继续写入 -
syslog + logrotate:设
auditLog.destination: syslog,再用rsyslog把审计日志路由到独立文件(如/var/log/mongodb/audit.log),最后用logrotate按 daily/size 轮转 —— 此时需在logrotate配置中使用copytruncate(因 syslog 进程持有文件句柄,不能 rename)
注意:logRotate: "audit" 命令只作用于当前节点,副本集/分片集群中每个 mongod 实例都得单独执行。
auditLog.path 权限与磁盘空间是最大隐患
审计日志增长极快,尤其开启 {"atype": "update"} 或高频 find 过滤时。容易踩的坑:
- 路径所在分区磁盘不足 → 写入失败,后续审计事件静默丢弃(无告警)
-
auditLog.path目录属主不是mongodb用户 → 启动失败,报错Unable to open audit log file - 没配
auditLog.format: JSON→ 默认 BSON 格式,后续解析困难,jq/grep 无法直接处理
生产环境上线前务必验证:sudo -u mongodb touch /var/log/mongodb/audit.log && sudo -u mongodb chmod 600 /var/log/mongodb/audit.log。


















