OpenMetadata 會將日誌文件自動存儲到指定的 log 目錄中,但目前無法透過官方提供的 openmetadata.yaml 配置文件直接實現 logrotate 功能。這導致當日誌文件(如 catalog.log)不斷增長時,可能會造成存儲空間壓力和管理困難。

原本考慮利用 Linux 系統內建的 logrotate 工具解決這一問題,但發現一個限制:當 catalog.log 被刪除後,即使重新建立(如通過 touch catalog.log),OpenMetadata 的應用程式無法繼續將日誌寫入新生成的文件。因此,無法使用傳統的 logrotate 方法將 catalog.log 重命名為例如 catalog-{yesterday-date}.log 並重新創建新的日誌文件。

解決方案#

為了解決刪除 catalog.log 後無法繼續記錄日誌的問題,採用以下方法:

  1. 將現有的 catalog.log 文件內容複製到備份文件中。

  2. 清空原始 catalog.log 文件,而不是直接刪除。

  3. 壓縮備份文件,並刪除七天以上的舊備份。

以下是具體實現的 Bash 腳本:

#!/bin/bash

# 設定日誌文件路徑
LOG_FILE="/opt/openmetadata/logs/catalog.log"
BACKUP_DIR="/opt/openmetadata/logs"  
TODAY=$(date +%Y-%m-%d)
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)

# 1. 複製當前的 catalog.log 為 catalog-{前一天日期}.log
cp "$LOG_FILE" "$BACKUP_DIR/catalog-$YESTERDAY.log"

# 2. 清空 catalog.log
> "$LOG_FILE"

# 3. 壓縮前一天的 log
gzip "$BACKUP_DIR/catalog-$YESTERDAY.log"

# 4. 刪除七天前的日誌備份
find "$BACKUP_DIR" -name "catalog-*.log.gz" -mtime +7 -exec rm {} \;

腳本說明#

  1. 複製日誌文件

    • 使用 cp 命令將當前的 catalog.log 複製為前一天日期命名的備份文件,例如 catalog-2024-12-06.log
  2. 清空原始日誌文件

    • 使用 > "$LOG_FILE" 清空文件內容,而不是刪除文件。這確保 OpenMetadata 可以繼續向該文件寫入日誌。
  3. 壓縮備份

    • 使用 gzip 將備份的日誌文件壓縮為 .gz 格式,以節省存儲空間。
  4. 清理舊備份

    • 使用 find 命令刪除超過七天的壓縮日誌文件,避免備份文件數量無限制增長。

部署方法#

  1. 保存腳本: 將上述腳本保存為 /opt/openmetadata/logrotate.sh,並確保腳本具有執行權限:

    chmod +x /opt/openmetadata/logrotate.sh
    
  2. 設置定時任務: 使用 crontab 配置每日運行該腳本,例如:

    crontab -e
    

    添加以下行:

    0 0 * * * /opt/openmetadata/logrotate.sh
    

    這表示每天午夜執行一次日誌輪轉腳本。

優勢#

  • 避免刪除問題:清空文件而非刪除,確保 OpenMetadata 繼續記錄日誌。

  • 自動化:結合 crontab 實現完全自動化的日誌管理。

  • 節省空間:壓縮備份文件並定期清理過期文件,降低存儲壓力。

透過此方案,可以有效管理 OpenMetadata 的日誌文件,避免因日誌文件膨脹造成的問題,並保證系統穩定運行。