温馨提示×

Debian系统中MongoDB日志管理技巧

小樊
43
2025-11-01 05:37:54
栏目: 云计算

Debian系统中MongoDB日志管理技巧

1. 配置日志路径与级别

MongoDB的日志配置通过/etc/mongod.conf文件完成,核心参数包括:

  • 日志路径:设置systemLog.path为具体文件路径(如/var/log/mongodb/mongod.log),指定日志存储位置;
  • 日志追加systemLog.logAppend设为true,确保MongoDB重启后日志追加到现有文件,而非覆盖;
  • 日志级别systemLog.verbosity控制详细程度(0-5级,0仅记录警告/错误,5记录所有操作细节),默认为0(仅关键信息)。
    修改配置后,需重启MongoDB服务使更改生效:sudo systemctl restart mongod

2. 日志轮转设置(避免日志膨胀)

使用logrotate工具实现日志自动轮转,步骤如下:

  • 安装logrotate(若未安装):sudo apt-get install logrotate
  • 创建MongoDB专用配置文件sudo nano /etc/logrotate.d/mongodb,添加以下内容:
    /var/log/mongodb/mongod.log {
        daily               # 每天轮转
        rotate 7            # 保留最近7个日志文件
        compress            # 压缩旧日志(gzip)
        missingok           # 日志文件丢失时不报错
        notifempty          # 日志为空时不轮转
        create 0640 mongodb adm  # 新日志文件权限(属主mongodb,属组adm)
        postrotate          # 轮转后执行的命令
            /bin/kill -SIGUSR1 $(cat /var/log/mongodb/mongod.lock 2>/dev/null) 2>/dev/null || true
        endscript
    }
    
    该配置确保日志每日切割、保留7天、压缩存储,并通过SIGUSR1信号通知MongoDB进程切换至新日志文件。

3. 日志查看与分析

  • 基础查看:使用tail命令实时查看最新日志(如sudo tail -f /var/log/mongodb/mongod.log);
  • 过滤关键信息:用grep筛选特定关键字(如错误信息sudo grep "error" /var/log/mongodb/mongod.log);
  • 结构化分析:通过jq工具解析JSON格式日志(如提取msg字段sudo cat /var/log/mongodb/mongod.log | jq '.msg'),便于快速定位问题。

4. 手动触发日志轮转

无需等待自动轮转时,可通过MongoDB Shell手动执行:

use admin
db.runCommand({ logRotate: 1 })

该命令会立即切割当前日志文件,生成新的mongod.log,并自动压缩旧日志。

5. 日志归档与清理

  • 自动归档脚本:编写Shell脚本定期将当前日志移动至归档目录(如/var/log/mongodb/archive/),并添加时间戳(如mongod_2025-11-01.log),示例代码:
    import os
    import shutil
    from datetime import datetime
    
    LOG_DIR = '/var/log/mongodb/'
    ARCHIVE_DIR = '/var/log/mongodb/archive/'
    LOG_FILE = os.path.join(LOG_DIR, 'mongod.log')
    
    if not os.path.exists(ARCHIVE_DIR):
        os.makedirs(ARCHIVE_DIR)
    
    if os.path.exists(LOG_FILE):
        today = datetime.now().strftime('%Y-%m-%d')
        archive_file = os.path.join(ARCHIVE_DIR, f'mongod_{today}.log')
        shutil.move(LOG_FILE, archive_file)
        print(f"日志已归档至 {archive_file}")
    
  • 清理旧日志:在归档脚本中添加逻辑,删除超过30天的归档日志(如os.remove(file_path)),避免磁盘空间耗尽。

0