將日誌寫入 Elasticsearch¶
Airflow 可以配置為從 Elasticsearch 讀取任務日誌,並可選擇以標準或 json 格式將日誌寫入 stdout。這些日誌稍後可以使用 fluentd、logstash 或其他工具收集並轉發到 Elasticsearch 集群。
您可以選擇將所有來自 worker 的任務日誌輸出到最高父級別的進程,而不是標準檔案位置。這在 Kubernetes 等容器環境中提供了額外的靈活性,在這些環境中,容器 stdout 已經被記錄到主機節點。從那裡可以使用日誌傳輸工具將它們轉發到 Elasticsearch。要使用此功能,請在 airflow.cfg
中設定 write_stdout
選項。您也可以選擇使用 json_format
選項以 JSON 格式輸出日誌。Airflow 使用標準 Python logging 模組,JSON 欄位直接從 LogRecord 物件中提取。要使用此功能,請在 airflow.cfg
中設定 json_fields
選項。將您想要為日誌收集的欄位添加到逗號分隔的字串中。這些欄位來自 logging
模組中的 LogRecord 物件。有關不同屬性的文件可以在這裡找到。
首先,要使用 handler,必須如下配置 airflow.cfg
[logging]
remote_logging = True
[elasticsearch]
host = <host>:<port>
要以 JSON 格式將任務日誌輸出到 stdout,可以使用以下配置
[logging]
remote_logging = True
[elasticsearch]
host = <host>:<port>
write_stdout = True
json_format = True
透過 TLS 將日誌寫入 Elasticsearch¶
要將自訂配置添加到 ElasticSearch(例如,開啟 ssl_verify
、新增自訂的自簽憑證等),請在您的 airflow.cfg
中使用 elasticsearch_configs
設定
[logging]
remote_logging = True
[elasticsearch_configs]
verify_certs=True
ca_certs=/path/to/CA_certs
Elasticsearch 外部連結¶
使用者可以配置 Airflow 以顯示指向 Elasticsearch 日誌檢視系統(例如 Kibana)的連結。
要啟用它,必須如下例所示配置 airflow.cfg
。請注意 URL 中所需的 {log_id}
,在建構外部連結時,Airflow 會將此參數替換為用於寫入日誌的相同 log_id_template
(請參閱 將日誌寫入 Elasticsearch)。
[elasticsearch]
# Qualified URL for an elasticsearch frontend (like Kibana) with a template argument for log_id
# Code will construct log_id using the log_id template from the argument above.
# NOTE: scheme will default to https if one is not provided
frontend = <host_port>/{log_id}
變更 [elasticsearch] log_id_template
¶
如果您需要變更 [elasticsearch] log_id_template
,Airflow 2.3.0+ 能夠追蹤舊值,以便仍然可以提取您現有的任務執行日誌。一旦您使用 Airflow 2.3.0+,一般來說,您可以隨意更改 log_id_template
,Airflow 將會追蹤變更。
但是,當您升級到 2.3.0+ 時,Airflow 可能無法正確儲存您之前的 log_id_template
。如果在升級後發現您的任務日誌不再可存取,請嘗試在 log_template
表格中新增一行,其中 id=0
包含您之前的 log_id_template
。例如,如果您在 2.2.5 中使用了預設值
INSERT INTO log_template (id, filename, elasticsearch_id, created_at) VALUES (0, '{{ ti.dag_id }}/{{ ti.task_id }}/{{ ts }}/{{ try_number }}.log', '{dag_id}-{task_id}-{execution_date}-{try_number}', NOW());