GCP
PR

GCP Composer(airflow)のアプリログを日付指定(または年月指定)で削除する

ycsg113XYZ
記事内に商品プロモーションを含む場合があります
スポンサーリンク

アプリログが溜まっていく

GCP Composer(airflow)のアプリログはGoogle Storageに格納されます。

そしてログをクリーニングする機能は無いため、どんどん溜まっていきます。

溜まったままにしておいても良いかと思いますが、ストレージへの保管料ももったいないですし、何よりAirflowが遅くなってる気がするのです。

以前、大量に溜まったログを削除したらAirflowが早くなりました。

そのため定期的に削除する必要があります。

composerのアプリログの構造

例えばDAGが1つあり、その中にタスクが

  • TASK1、TASK2、TASK3

とある場合、日々のログは次のように溜まっていきます。

airflowで使用しちるgcsのlogsディレクトリ
  DAG01
     TASK01
         [スケジュールの日時yyyy-mm-dd]
    1.log
         [スケジュールの日時yyyy-mm-dd]
    1.log
         [スケジュールの日時yyyy-mm-dd]
    1.log
     TASK02
         [スケジュールの日時yyyy-mm-dd]
    1.log
         [スケジュールの日時yyyy-mm-dd]
    1.log
         [スケジュールの日時yyyy-mm-dd]
    1.log
     TASK02
         [スケジュールの日時yyyy-mm-dd]
    1.log
         [スケジュールの日時yyyy-mm-dd]
    1.log
         [スケジュールの日時yyyy-mm-dd]
    1.log
 

このようにTASK単位、さらに実行日単位にログが出力されるため、例えば1ヶ月分だけ残して過去分削除したいとなった場合に消すのが大変です。

一括で削除するコマンドはこちら

1日分削除するコマンド

gsutil ls -r gs://[composer使用のGCSバケット]/logs/* | grep -v "/:" | grep "2022-01-20" | xargs gsutil rm
※上記の2022-01-20 の箇所を削除する年月日にする

1ヶ月分削除するコマンド

gsutil ls -r gs://[composer使用のGCSバケット]/logs/* | grep -v "/:" | grep "2022-01-" | xargs gsutil rm
※上記の2022-01- の箇所を削除する年月にする。

最後に

定期的に実行するためにAirflowにDAGを作成するのが良いかと思います!

上記コマンドはBashOperatorで実行可能です!日付の箇所はairflowの日付macroで置換してください

あつし
あつし

え、DAGのサンプルは無いんですか?

ひろし
ひろし

それは次回までの宿題だね!

追記 毎日100日前のログを消すDAGサンプル

以下に100日前のログを消すサンプルコードを示します!19行目くらいにある-100が100日前を指しています。

# coding:utf-8
from airflow import DAG
from datetime import datetime, timedelta, time
from airflow.operators.bash_operator import BashOperator

default_args = {
    'owner': 'sample',
    'depends_on_past': False,  
    'start_date': datetime(2023, 2, 10)
}

dag = DAG(
    'dag_delete_airflow_log', 
    default_args=default_args,
    schedule_interval='0 9 * * *',
    catchup=True,
)

delete_date = '{{ macros.ds_format(macros.ds_add(next_ds, -100), "%Y-%m-%d", "%Y-%m-%d") }}'
shellcommand = 'gsutil ls -r gs://[composer使用のGCSバケット]/logs/* | grep -v "/:" | grep "' + delete_date + '" | xargs gsutil rm'

delete_airflow_log = BashOperator(
    task_id='task_delete_airflow_log',
    bash_command=shellcommand,
    dag=dag
)

delete_airflow_log
スポンサーリンク
ABOUT ME
ひろし
ひろし
都内在中のなんちゃってSE。ギリギリPG。の私が管理者のひろしです。 日々夜遅くまで仕事に追われています。 今日は早く帰りたい・・・
スポンサーリンク
記事URLをコピーしました