外观
MongoDB 日志类型与位置
系统日志
用途:
- 记录 MongoDB 服务器的运行状态
- 包含启动、关闭、错误、警告等信息
- 用于故障诊断和性能监控
- 支持不同的日志级别
日志级别:
quiet:只记录严重错误v:详细模式,输出更多信息vv:更详细的调试信息vvv:非常详细的调试信息,包括复制和选举信息vvvv:最详细的调试信息,包括低级网络活动
审计日志
用途:
- 记录数据库的访问和操作
- 包含用户认证、授权、CRUD 操作等
- 用于安全审计和合规性要求
- 支持多种输出格式
记录内容:
- 用户登录和登出
- 数据库和集合操作
- 索引创建和删除
- 用户和角色管理
- 集群配置变更
慢查询日志
用途:
- 记录执行时间超过阈值的查询
- 用于性能优化和查询分析
- 包含查询语句、执行时间、扫描文档数等
- 支持不同的慢查询阈值设置
记录内容:
- 查询语句
- 执行时间(毫秒)
- 扫描文档数
- 返回文档数
- 索引使用情况
- 客户端信息
日志位置配置
默认位置
Linux/macOS:
- 默认日志目录:
/var/log/mongodb/ - 默认日志文件:
mongod.log - 可通过配置文件修改
Windows:
- 默认日志目录:
C:\Program Files\MongoDB\Server\{version}\log\ - 默认日志文件:
mongod.log - 可通过配置文件或命令行参数修改
配置文件设置
mongod.conf 示例:
yaml
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
logRotate: reopen
verbosity: 0
auditLog:
destination: file
format: BSON
path: /var/log/mongodb/audit.log
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp关键配置项:
destination:日志输出目标(file 或 syslog)logAppend:是否追加到现有日志文件path:日志文件路径logRotate:日志轮转方式(rename 或 reopen)verbosity:日志级别
命令行参数
启动时指定日志位置:
bash
# Linux/macOS
mongod --dbpath /data/db --logpath /var/log/mongodb/mongod.log --logappend
# Windows
mongod.exe --dbpath C:\data\db --logpath C:\Program Files\MongoDB\Server\6.0\log\mongod.log --logappend日志级别设置:
bash
# 设置详细日志级别
mongod --dbpath /data/db --logpath /var/log/mongodb/mongod.log --v 2
# 安静模式,只记录严重错误
mongod --dbpath /data/db --logpath /var/log/mongodb/mongod.log --quiet系统日志
系统日志内容
启动信息:
2023-01-01T12:00:00.000+0000 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2023-01-01T12:00:00.000+0000 I CONTROL [initandlisten] MongoDB starting : pid=12345 port=27017 dbpath=/data/db 64-bit host=mongodb-server
2023-01-01T12:00:00.000+0000 I CONTROL [initandlisten] db version v6.0.0
2023-01-01T12:00:00.000+0000 I CONTROL [initandlisten] git version: xxxxxxxx
2023-01-01T12:00:00.000+0000 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.1.1f 31 Mar 2020连接信息:
2023-01-01T12:01:00.000+0000 I NETWORK [listener] Listening on 0.0.0.0
2023-01-01T12:01:00.000+0000 I NETWORK [listener] waiting for connections on port 27017
2023-01-01T12:02:00.000+0000 I NETWORK [conn1] received client metadata from 127.0.0.1:12345 conn1: { application: { name: "MongoDB Shell" }, driver: { name: "MongoDB Internal Client", version: "6.0.0" }, os: { type: "Linux", name: "Ubuntu", version: "20.04" } }错误信息:
2023-01-01T12:03:00.000+0000 E STORAGE [journal] Insufficient free space for journal files
2023-01-01T12:03:00.000+0000 I STORAGE [journal] please make at least 3379MB available in /data/db/journal or use --smallfiles
2023-01-01T12:03:00.000+0000 I STORAGE [journal]
2023-01-01T12:03:00.000+0000 E STORAGE [initandlisten] Failed to set up journal dir: /data/db/journal
2023-01-01T12:03:00.000+0000 I STORAGE [initandlisten] exception in initAndListen: Location28596: Failed to set up journal dir: /data/db/journal, terminating审计日志配置
审计日志启用
配置文件方式:
yaml
auditLog:
destination: file
format: BSON
path: /var/log/mongodb/audit.log
filter: '{ "atype": "authCheck" }' # 可选,只记录认证检查命令行方式:
bash
mongod --dbpath /data/db \
--auditDestination file \
--auditFormat BSON \
--auditPath /var/log/mongodb/audit.log审计日志格式
BSON 格式:
- 二进制 JSON 格式
- 支持高效查询和分析
- 适合大型审计日志
- 可使用
mongosh查询
JSON 格式:
- 人类可读的 JSON 格式
- 适合手动查看和简单分析
- 支持文本处理工具
- 示例:json
{ "atype": "authCheck", "ts": { "$date": "2023-01-01T12:00:00.000Z" }, "local": { "ip": "127.0.0.1", "port": 27017 }, "remote": { "ip": "127.0.0.1", "port": 12345 }, "users": [], "roles": [], "param": { "command": "insert", "ns": "test.users" }, "result": 0 }
Syslog 格式:
- 输出到系统日志
- 适合集成到现有日志管理系统
- 支持 syslog 设施和级别
审计日志过滤
过滤规则:
- 只记录特定类型的操作
- 减少日志体积和性能开销
- 支持 JSON 查询语法
示例过滤规则:
yaml
# 只记录认证和授权操作
auditLog:
filter: '{ "atype": { "$in": ["authCheck", "authStart"] } }'
# 只记录特定数据库的操作
auditLog:
filter: '{ "param.ns": /^mydb\./ }'
# 只记录失败的操作
auditLog:
filter: '{ "result": { "$ne": 0 } }'慢查询日志配置
慢查询日志启用
配置文件方式:
yaml
operationProfiling:
slowOpThresholdMs: 100 # 慢查询阈值,单位毫秒
mode: slowOp # 只记录慢查询
# 或 mode: all # 记录所有操作命令行方式:
bash
mongod --dbpath /data/db \
--slowms 100 \
--profile 1 # 1: 只记录慢查询,2: 记录所有操作慢查询日志查看
使用 db.currentOp():
javascript
// 查看当前正在执行的慢查询
db.currentOp({ "active": true, "secs_running": { "$gt": 1 } })使用 db.system.profile 集合:
javascript
// 查看最近的慢查询
db.system.profile.find().sort({ ts: -1 }).limit(10)
// 查看特定集合的慢查询
db.system.profile.find({ "ns": "test.users" }).sort({ ts: -1 })
// 查看执行时间超过 200ms 的查询
db.system.profile.find({ "millis": { "$gt": 200 } }).sort({ ts: -1 })慢查询日志分析
关键指标:
millis:查询执行时间(毫秒)docsExamined:扫描的文档数nreturned:返回的文档数indexBounds:使用的索引范围planSummary:查询计划摘要
优化建议:
- 为频繁查询的字段创建索引
- 优化查询语句,减少扫描文档数
- 考虑使用覆盖索引
- 调整查询逻辑,减少返回文档数
日志轮转与管理
日志轮转配置
rename 方式:
- 默认的日志轮转方式
- MongoDB 关闭当前日志文件,重命名为
filename.0,然后创建新的日志文件 - 需要外部工具配合(如 logrotate)
reopen 方式:
- MongoDB 关闭并重新打开日志文件
- 适合配合外部日志轮转工具
- 配置示例:yaml
systemLog: logRotate: reopen
### Linux logrotate 配置
**配置文件示例**:/var/log/mongodb/mongod.log { daily rotate 7 compress delaycompress missingok notifempty create 0640 mongodb mongodb postrotate /bin/kill -SIGUSR1 $(cat /var/run/mongodb/mongod.pid 2>/dev/null) 2>/dev/null || true endscript }
**配置说明**:
- `daily`:每天轮转一次
- `rotate 7`:保留 7 天的日志
- `compress`:压缩旧日志
- `delaycompress`:延迟压缩,只压缩前一天的日志
- `create 0640 mongodb mongodb`:创建新日志文件,权限为 0640,所有者为 mongodb:mongodb
- `postrotate`:轮转后执行的命令,发送 SIGUSR1 信号通知 MongoDB 重新打开日志文件
### 日志清理策略
**定期清理**:
- 结合 logrotate 配置,自动清理过期日志
- 保留足够的日志用于故障诊断
- 根据磁盘空间和合规要求调整保留时间
**集中管理**:
- 使用日志管理系统(如 ELK Stack、Splunk)
- 实现日志的集中存储和分析
- 支持日志搜索、告警和可视化
- 提高日志管理效率
## 日志监控与分析
### 日志监控工具
**mongostat**:
- 监控 MongoDB 实例的实时性能指标
- 包含操作数、延迟、连接数等
- 支持按时间间隔输出数据
- 示例:`mongostat --host localhost:27017 --discover`
**mongotop**:
- 监控集合级别的读写情况
- 帮助识别热点集合
- 支持实时监控
- 示例:`mongotop --host localhost:27017 --sleep 1`
**MongoDB Atlas**:
- 提供日志监控和告警功能
- 支持日志搜索和分析
- 可视化展示日志数据
- 适合云部署的 MongoDB
### 日志分析方法
**错误日志分析**:
- 搜索关键字如 "error"、"exception"、"failed"
- 分析错误发生的时间和频率
- 关联错误与系统事件
- 制定相应的修复措施
**性能日志分析**:
- 分析慢查询日志,识别性能瓶颈
- 监控查询执行时间的变化趋势
- 分析索引使用情况
- 优化查询和索引
**安全日志分析**:
- 监控异常登录尝试
- 分析权限变更
- 检测可疑操作
- 确保合规性要求
## 常见问题(FAQ)
### Q1: 如何查看 MongoDB 的日志文件?
A1: 可以通过以下方式查看:
- 使用 `tail -f` 命令实时查看:`tail -f /var/log/mongodb/mongod.log`
- 使用 `mongosh` 连接到 MongoDB,执行 `show logs` 查看日志文件列表,然后使用 `db.adminCommand({ getLog: "file" })` 查看日志内容
- 在 MongoDB Atlas 中,通过 "Logs" 选项卡查看
### Q2: 如何调整 MongoDB 的日志级别?
A2: 可以通过以下方式调整:
- 在配置文件中设置 `verbosity` 参数
- 启动时使用 `--v`、`--vv` 等命令行参数
- 运行时使用 `db.adminCommand({ setParameter: 1, logLevel: 2 })` 动态调整
### Q3: 审计日志会影响 MongoDB 的性能吗?
A3: 是的,审计日志会带来一定的性能开销,具体取决于:
- 审计日志的格式(BSON 比 JSON 性能更好)
- 审计日志的过滤规则(过滤后的日志越少,性能开销越小)
- 系统的硬件配置
建议根据实际需求配置审计日志,避免不必要的性能开销。
### Q4: 如何设置慢查询阈值?
A4: 可以通过以下方式设置:
- 在配置文件中设置 `slowOpThresholdMs` 参数
- 启动时使用 `--slowms` 命令行参数
- 运行时使用 `db.setProfilingLevel(1, 200)` 动态调整(200 为慢查询阈值,单位毫秒)
### Q5: 如何管理 MongoDB 的日志文件大小?
A5: 可以通过以下方式管理:
- 配置 logrotate,自动轮转和压缩日志文件
- 调整日志级别,减少日志输出量
- 使用日志过滤规则,只记录必要的日志
- 定期清理过期日志文件
### Q6: 如何将 MongoDB 日志发送到 syslog?
A6: 可以通过以下方式配置:
```yaml
systemLog:
destination: syslog
syslogFacility: local0
logAppend: true或使用命令行参数:
bash
mongod --dbpath /data/db --syslog --syslogFacility local0Q7: 如何查看副本集的日志?
A7: 副本集的日志包含额外的复制和选举信息:
- 主节点日志包含写操作和复制信息
- 从节点日志包含复制和同步信息
- 使用
--replSet参数启动时,日志会包含副本集相关信息 - 可以通过
rs.status()查看副本集状态,结合日志分析复制问题
Q8: 如何分析 MongoDB 的慢查询日志?
A8: 分析慢查询日志的步骤:
- 查看慢查询日志,识别执行时间长的查询
- 分析查询的
docsExamined和nreturned,判断是否存在全表扫描 - 检查
indexBounds,确认是否使用了合适的索引 - 根据
planSummary优化查询计划 - 实施优化措施,如创建索引、调整查询语句
- 验证优化效果,比较优化前后的执行时间
