一、配置日志路径与级别
在Linux系统中,MongoDB的日志配置主要通过修改/etc/mongod.conf
(新版本)或/etc/mongodb.conf
(旧版本)文件实现。关键参数说明:
file
(日志写入文件)或stderr
(输出到标准错误);/var/log/mongodb/mongod.log
);true
(默认),确保新日志追加到现有文件末尾而非覆盖;sudo systemctl restart mongod
。二、日志轮转管理
为防止日志文件过大占用磁盘空间,需通过logrotate工具实现自动轮转。步骤如下:
sudo apt-get install logrotate
;sudo yum install logrotate
。/etc/logrotate.d/mongodb
文件,添加以下内容(示例为每天轮转、保留7份、压缩旧日志):/var/log/mongodb/mongod.log {
daily
missingok
rotate 7
compress
notifempty
create 640 mongodb adm
sharedscripts
postrotate
/bin/kill -SIGUSR1 $(cat /var/log/mongodb/mongod.lock 2>/dev/null || echo 0)
endscript
}
参数说明:daily
(每天轮转)、rotate 7
(保留7份)、compress
(gzip压缩)、postrotate
(通过SIGUSR1信号通知MongoDB切换日志文件)。sudo logrotate -vf /etc/logrotate.d/mongodb
,验证配置是否正确。三、日志查看与实时监控
cat
命令查看全部日志内容:cat /var/log/mongodb/mongod.log
;tail -f
命令实时显示日志更新:tail -f /var/log/mongodb/mongod.log
;grep
命令筛选关键字(如错误日志):grep "ERROR" /var/log/mongodb/mongod.log
;less
命令分页浏览日志:less /var/log/mongodb/mongod.log
(按q
退出)。四、日志分析与高级管理
mtools
(sudo pip3 install mtools
),实现日志分析自动化:
mlogfilter mongod.log --slow 60000 | tail -n3
(筛选执行时间超过60秒的查询);mplotqueries mongod.log --group namespace --output-file query_trend.png
(按命名空间分组展示查询频率);mloginfo mongod.log
(输出日志文件的基本统计信息,如时长、操作类型分布)。jq
提取关键字段(如持续时间超过60秒的操作):jq '. | select(.attr.durationMillis >= 60000)' mongod.json
。五、日志备份与归档
rsync
或cp
命令将日志文件复制到备份目录(如/backup/mongodb/
):rsync -av /var/log/mongodb/mongod.log /backup/mongodb/
;import os
import shutil
from datetime import datetime, timedelta
LOG_DIR = '/var/log/mongodb/'
ARCHIVE_DIR = '/var/log/mongodb/archive/'
DAYS_TO_KEEP = 30
# 创建归档目录
if not os.path.exists(ARCHIVE_DIR):
os.makedirs(ARCHIVE_DIR)
# 归档当日日志
today = datetime.now().strftime('%Y-%m-%d')
log_file = os.path.join(LOG_DIR, 'mongod.log')
archive_file = os.path.join(ARCHIVE_DIR, f'mongod_{today}.log')
if os.path.exists(log_file):
shutil.move(log_file, archive_file)
print(f"日志已归档至 {archive_file}")
# 删除30天前的旧日志
cutoff_date = datetime.now() - timedelta(days=DAYS_TO_KEEP)
for filename in os.listdir(ARCHIVE_DIR):
file_path = os.path.join(ARCHIVE_DIR, filename)
if os.path.isfile(file_path):
file_mtime = datetime.fromtimestamp(os.path.getmtime(file_path))
if file_mtime < cutoff_date:
os.remove(file_path)
print(f"已删除过期日志:{file_path}")
将脚本添加到cron
定时任务(如每天凌晨1点执行):0 1 * * * /usr/bin/python3 /path/to/archive_script.py
。六、权限与安全控制
为防止未授权访问日志文件,需通过chmod
和chown
命令设置正确的权限:
sudo chown mongodb:adm /var/log/mongodb/mongod.log # 属主为mongodb用户,属组为adm
sudo chmod 640 /var/log/mongodb/mongod.log # 仅属主可写,属组可读
此设置确保只有MongoDB进程(属主)和管理员(属组)能访问日志内容,提升安全性。