Debian系統MongoDB日志管理技巧
日志配置的核心是通過MongoDB配置文件(/etc/mongod.conf)調整路徑和詳細程度。關鍵參數說明:
file表示文件,syslog表示系統日志,默認為file);/var/log/mongodb/mongod.log);true時,重啟服務會追加日志而非覆蓋(推薦開啟);systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
verbosity: 1
修改后需重啟MongoDB服務使配置生效:sudo systemctl restart mongod。
日志輪轉可防止日志文件過大占用磁盤空間,常用方法有兩種:
logrotate是Linux系統自帶的日志管理工具,需創建自定義配置文件(/etc/logrotate.d/mongodb),內容示例如下:
/var/log/mongodb/mongod.log {
daily # 每天輪轉一次(可改為weekly/monthly)
missingok # 若日志文件丟失,不報錯繼續執行
rotate 7 # 保留最近7個輪轉日志文件
compress # 使用gzip壓縮舊日志(節省空間)
notifempty # 若日志為空,不進行輪轉
create 0640 mongodb adm # 創建新日志文件,權限0640,屬主mongodb、屬組adm
sharedscripts # 所有日志輪轉完成后執行postrotate腳本
postrotate # 輪轉后發送SIGUSR1信號,通知mongod重新打開日志文件
/bin/kill -SIGUSR1 `cat /var/log/mongodb/mongod.lock` 2>/dev/null || true
endscript
}
配置完成后,logrotate會根據/etc/logrotate.conf中的daily設置自動執行(或手動運行sudo logrotate -vf /etc/logrotate.d/mongodb測試)。
若不想依賴logrotate,可通過以下兩種方式手動輪轉:
db.adminCommand({logRotate: 1}),mongod會自動重命名當前日志文件(附加時間戳)并創建新日志文件;pgrep mongod),然后執行kill -SIGUSR1 <PID>,強制mongod輪轉日志。日常運維中,需快速定位問題或監控數據庫狀態,常用命令:
sudo tail -f /var/log/mongodb/mongod.log(動態顯示新增日志);sudo grep "ERROR" /var/log/mongodb/mongod.log(查找錯誤日志)、sudo grep "slow" /var/log/mongodb/mongod.log(查找慢查詢日志);jq工具解析JSON格式日志(需安裝sudo apt install jq),例如提取所有日志消息:sudo cat /var/log/mongodb/mongod.log | jq '.msg'。長期運行的MongoDB會產生大量日志,需定期歸檔舊日志以釋放空間:
編寫Shell腳本(如/usr/local/bin/archive_mongodb_logs.sh),實現日志歸檔與清理:
#!/bin/bash
LOG_DIR="/var/log/mongodb"
ARCHIVE_DIR="$LOG_DIR/archive"
CURRENT_DATE=$(date +%Y-%m-%d)
# 創建歸檔目錄(若不存在)
mkdir -p "$ARCHIVE_DIR"
# 歸檔當前日志(移動并重命名)
if [ -f "$LOG_DIR/mongod.log" ]; then
mv "$LOG_DIR/mongod.log" "$ARCHIVE_DIR/mongod_$CURRENT_DATE.log"
# 重新創建空日志文件(避免服務中斷)
touch "$LOG_DIR/mongod.log"
chown mongodb:mongodb "$LOG_DIR/mongod.log"
fi
# 清理30天前的歸檔日志
find "$ARCHIVE_DIR" -type f -name "mongod_*.log" -mtime +30 -exec rm -f {} \;
添加執行權限并設置crontab每日執行:
sudo chmod +x /usr/local/bin/archive_mongodb_logs.sh
echo "0 0 * * * /usr/local/bin/archive_mongodb_logs.sh" | sudo tee /etc/cron.daily/archive_mongodb_logs
若無需歸檔,可直接刪除超過一定時間的日志文件(如30天前):
sudo find /var/log/mongodb -name "*.log.*" -mtime +30 -exec rm -f {} \;
操作前建議備份重要日志,避免誤刪。
若需更細粒度的日志控制(如僅記錄查詢日志、忽略慢查詢),可調整日志組件級別:
db.getLogComponents()(返回各組件(如query、replication)的verbosity值);db.setLogLevel(<級別>, "<組件>")(例如,將查詢組件級別設為2,僅記錄警告及以上查詢日志:db.setLogLevel(2, "query"))。db.setLogLevel(0, "replication")
注意:修改組件級別后無需重啟服務,立即生效。