進階日誌設定

並非所有設定選項都可從 airflow.cfg 檔案取得。此設定檔說明如何設定任務的日誌記錄,因為任務產生的日誌預設不僅記錄在個別檔案中,還必須可透過網頁伺服器存取。

預設情況下,標準 Airflow 組件日誌會寫入 $AIRFLOW_HOME/logs 目錄,但您也可以透過覆寫 Python 日誌記錄器設定來自訂和設定,此設定可透過提供自訂日誌設定物件來完成。您也可以為特定 operators 和任務建立及使用日誌設定。

某些設定選項需要覆寫日誌設定類別。您可以透過複製 Airflow 的預設設定並修改以符合您的需求來完成。

預設設定可以在airflow_local_settings.py 範本中看到,您可以在其中看到使用的日誌記錄器和處理常式。

請參閱設定本機設定以取得如何設定本機設定的詳細資訊。

除了可透過 airflow.cfg 在此設定的自訂日誌記錄器和處理常式外,Airflow 中的日誌記錄方法遵循常見的 Python 日誌記錄慣例,即 Python 物件會記錄到遵循 <package>.<module_name> 命名慣例的日誌記錄器。

您可以在Python 日誌記錄文件中閱讀更多關於標準 Python 日誌記錄類別 (Loggers、Handlers、Formatters) 的資訊。

建立自訂日誌類別

您可以透過 airflow.cfg 檔案中的 logging_config_class 選項來設定您的日誌記錄類別。此設定應指定與 logging.config.dictConfig() 相容的設定匯入路徑。如果您的檔案是標準匯入位置,則應設定 PYTHONPATH 環境變數。

按照以下步驟啟用自訂日誌設定類別

  1. 首先將環境變數設定為已知目錄,例如 ~/airflow/

    export PYTHONPATH=~/airflow/
    
  2. 建立一個目錄來儲存設定檔,例如 ~/airflow/config

  3. 建立名為 ~/airflow/config/log_config.py 的檔案,內容如下

    from copy import deepcopy
    from airflow.config_templates.airflow_local_settings import DEFAULT_LOGGING_CONFIG
    
    LOGGING_CONFIG = deepcopy(DEFAULT_LOGGING_CONFIG)
    
  4. 在檔案末尾,新增程式碼以修改預設字典設定。

  5. 更新 $AIRFLOW_HOME/airflow.cfg 以包含

    [logging]
    logging_config_class = log_config.LOGGING_CONFIG
    

如果您計劃僅在啟用遠端日誌記錄的情況下擴充/更新設定,您也可以將 logging_config_class 與遠端日誌記錄一起使用。然後,深層複製的字典將包含為您產生的遠端日誌記錄設定,並且您的修改將在新增遠端日誌記錄設定後套用

[logging]
remote_logging = True
logging_config_class = log_config.LOGGING_CONFIG
  1. 重新啟動應用程式。

請參閱模組管理以取得關於 Python 和 Airflow 如何管理模組的詳細資訊。

注意

您可以覆寫組件的標準日誌和「任務」日誌的處理方式。

Operators、Hooks 和任務的自訂日誌記錄器

您可以建立自訂日誌記錄處理常式,並將其套用至特定的 Operators、Hooks 和任務。預設情況下,Operators 和 Hooks 日誌記錄器是 airflow.task 日誌記錄器的子項:它們分別遵循 airflow.task.operators.<package>.<module_name>airflow.task.hooks.<package>.<module_name> 的命名慣例。在建立自訂日誌類別後,您可以將特定的日誌記錄器指派給它們。

SQLExecuteQueryOperator 和 HttpHook 的自訂日誌記錄範例

from copy import deepcopy
from pydantic.utils import deep_update
from airflow.config_templates.airflow_local_settings import DEFAULT_LOGGING_CONFIG

LOGGING_CONFIG = deep_update(
    deepcopy(DEFAULT_LOGGING_CONFIG),
    {
        "loggers": {
            "airflow.task.operators.airflow.providers.common.sql.operators.sql.SQLExecuteQueryOperator": {
                "handlers": ["task"],
                "level": "DEBUG",
                "propagate": True,
            },
            "airflow.task.hooks.airflow.providers.http.hooks.http.HttpHook": {
                "handlers": ["task"],
                "level": "WARNING",
                "propagate": False,
            },
        }
    },
)

您也可以使用 logger_name 屬性為 Dag 的任務設定自訂名稱。如果多個任務使用相同的 Operator,但您想要停用其中一些任務的日誌記錄,這會很有用。

自訂日誌記錄器名稱範例

# In your Dag file
SQLExecuteQueryOperator(..., logger_name="sql.big_query")

# In your custom `log_config.py`
LOGGING_CONFIG = deep_update(
    deepcopy(DEFAULT_LOGGING_CONFIG),
    {
        "loggers": {
            "airflow.task.operators.sql.big_query": {
                "handlers": ["task"],
                "level": "WARNING",
                "propagate": True,
            },
        }
    },
)

如果您想要限制任務的日誌大小,您可以新增 handlers.task.max_bytes 參數。

限制任務大小的範例

from copy import deepcopy
from pydantic.utils import deep_update
from airflow.config_templates.airflow_local_settings import DEFAULT_LOGGING_CONFIG

LOGGING_CONFIG = deep_update(
    deepcopy(DEFAULT_LOGGING_CONFIG),
    {
        "handlers": {
            "task": {
                "max_bytes": 104857600,  # 100MB
            }
        }
    },
)

這個條目有幫助嗎?