# 寫日志
> 貢獻者:[@ImPerat0R\_](https://github.com/tssujt)、[@ThinkingChen](https://github.com/cdmikechen)
## 在本地寫日志
用戶可以使用在`airflow.cfg`中的`base_log_folder`指定日志文件夾。默認情況下,它位于`AIRFLOW_HOME`目錄中。
此外,用戶也可以提供遠程位置,以便在云存儲中存儲日志和日志備份。
在 Airflow Web UI 中,本地日志優先于遠程日志。 如果找不到或訪問本地日志,將顯示遠程日志。 請注意,只有在任務完成(包括失敗)后才會將日志發送到遠程存儲。 換句話說,運行任務的遠程日志不可用。日志以`{dag_id}/{task_id}/{execution_date}/{try_number}.log`的路徑格式存儲在日志文件夾中。
## 將日志寫入 Amazon S3
### 在您開始之前
遠程日志記錄使用現有的 Airflow 連接來讀取/寫入日志。如果沒有正確設置連接,則會失敗。
### 啟用遠程日志記錄
要啟用此功能,必須按照此示例配置`airflow.cfg` :
```py
[core]
# Airflow 可以在 AWS S3 中遠程存儲日志。用戶必須提供一個遠程地址的 URL(以's3://...'開始)
# 和一個提供對存儲位置訪問的 Airflow 連接 id
remote_base_log_folder = s3://my-bucket/path/to/logs
remote_log_conn_id = MyS3Conn
# 對存儲在 S3 中的日志使用服務器端加密
encrypt_s3_logs = False
```
在上面的例子中,Airflow 將嘗試使用`S3Hook('MyS3Conn')` 。
## 將日志寫入 Azure Blob Storage
在 Azure Blob Storage 中 Airflow 可以為配置讀取和寫入任務日志。 可以按照以下步驟啟用 Azure Blob Storage 日志記錄。
1. Airflow 的日志記錄系統需要將一個自定義的 .py 文件 放在`PYTHONPATH`,以便可以從 Airflow 導入。首先創建一個存儲配置文件的目錄。建議使用`$AIRFLOW_HOME/config`。
2. 創建名為`$AIRFLOW_HOME/config/log_config.py`和`$AIRFLOW_HOME/config/__init__.py`的空文件。
3. 將`airflow/config_templates/airflow_local_settings.py`的內容復制到剛剛在上面的步驟中創建的`log_config.py`文件中。
4. 自定義模板的以下部分:
```py
# wasb buckets 應該從“wasb”開始,以幫助 Airflow 選擇正確的處理程序
REMOTE_BASE_LOG_FOLDER = 'wasb-<whatever you want here>'
# 重命名 DEFAULT_LOGGING_CONFIG 為 LOGGING CONFIG
LOGGING_CONFIG = ...
```
5. 確保已在 Airflow 中定義 Azure Blob Storage(Wasb)的連接 hook。hook 應具有在`REMOTE_BASE_LOG_FOLDER`中定義的 Azure Blob Storage bucket 的讀寫訪問權限。
6. 更新`$AIRFLOW_HOME/airflow.cfg`以包含:
```py
remote_logging = True
logging_config_class = log_config.LOGGING_CONFIG
remote_log_conn_id = <name of the Azure Blob Storage connection>
```
7. 重新啟動 Airflow webserver 和 scheduler,并觸發(或等待)新任務執行。
8. 驗證日志是否顯示在您定義的 bucket 中新執行的任務中。
## 將日志寫入 Google Cloud Storage
請按照以下步驟啟用 Google Cloud Storage 日志記錄。
要啟用此功能,必須按照此示例配置 airflow.cfg:
```py
[core]
# Airflow 可以在 AWS S3, Google Cloud Storage 或者 Elastic Search 中遠程存儲日志.
# 用戶必須提供可訪問存儲位置的 Airflow 連接 id。
# 如果 remote_logging 被設置為 true,請參見 UPDATING.md 以查看其他相關配置的要求。
remote_logging = True
remote_base_log_folder = gs://my-bucket/path/to/logs
remote_log_conn_id = MyGCSConn
```
1. 首先安裝`gcp_api`安裝包,`pip install apache-airflow[gcp_api]`。
2. 確保已在 Airflow 中定義了 Google Cloud Platform 連接 hook。該 hook 應具有對 remote_base_log_folder 中上面定義的 Google Cloud Storage bucket 的讀寫訪問權限。
3. 重新啟動 Airflow webserver 和 scheduler,并觸發(或等待)新任務執行。
4. 驗證日志是否在您定義的 bucket 中顯示新執行的任務日志。
5. 確認 Google Cloud Storage 查看器在 U??I 中正常運行。拉出新執行的任務,并驗證您是否看到類似的內容
```py
*** Reading remote log from gs://<bucket where logs should be persisted>/example_bash_operator/run_this_last/2017-10-03T00:00:00/16.log.
[2017-10-03 21:57:50,056] {cli.py:377} INFO - Running on host chrisr-00532
[2017-10-03 21:57:50,093] {base_task_runner.py:115} INFO - Running: ['bash', '-c', u'airflow run example_bash_operator run_this_last 2017-10-03T00:00:00 --job_id 47 --raw -sd DAGS_FOLDER/example_dags/example_bash_operator.py']
[2017-10-03 21:57:51,264] {base_task_runner.py:98} INFO - Subtask: [2017-10-03 21:57:51,263] {__init__.py:45} INFO - Using executor SequentialExecutor
[2017-10-03 21:57:51,306] {base_task_runner.py:98} INFO - Subtask: [2017-10-03 21:57:51,306] {models.py:186} INFO - Filling up the DagBag from /airflow/dags/example_dags/example_bash_operator.py
```
請注意頂行說明了它是從遠程日志文件中讀取的。