一、配置日志路徑與級別
在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進程(屬主)和管理員(屬組)能訪問日志內容,提升安全性。