TGViewer
DataEng DataEng @dataeng · 4.39K subscribers
Post #650 2.91K
Последние года 4 я использовал Apache Airflow исключительно в облаке, преимущественно в Amazon — Amazon Managed Apache Airflow. И как обычно бывает, в облаках всё так или иначе между собой связано. Логи хранятся в Cloud Watch, воркеры запускаются в изолированной среде (Amazon Fargate). С июля месяца я стал активно использовать self-hosted Airflow на своих серверах (для своих личных целей), и в целях экономии храню всё в файлах. Так уж получилось, что задачу с регулярной "чисткой" я постоянно откладывал и вот настал час X, когда всё легко из-за исчерпания inodes в файловой системе. Для этого случая я написал DAG, который каждый день в полночь чистит папки со старыми логами, делюсь с вами вдруг он пригодится:

import os
import shutil
from datetime import datetime, timedelta

import pendulum
import structlog
from airflow.sdk import DAG, task

logger = structlog.get_logger(__name__)

@task
def cleanup_airflow_logs(days_to_keep):
log_base_path = os.environ.get("AIRFLOW_HOME", "/opt/airflow") + "/logs"
cutoff_date = datetime.now() - timedelta(days=days_to_keep)

for root, dirs, files in os.walk(log_base_path):
for dir_name in dirs:
dir_path = os.path.join(root, dir_name)
try:
if os.path.getmtime(dir_path) < cutoff_date.timestamp():
logger.info(f"Deleting old log directory: {dir_path}")
shutil.rmtree(dir_path)
except Exception as e:
logger.error(f"Error deleting directory {dir_path}: {e}")


with DAG(
dag_id="airflow_log_cleanup_dag",
start_date=pendulum.datetime(2025, 10, 1, tz="Asia/Almaty"),
schedule="@daily", # Run daily at midnight
catchup=False,
default_args={
"owner": "airflow",
"retries": 2,
"retry_delay": timedelta(minutes=5),
},
max_active_runs=1,
) as dag:
cleanup_airflow_logs(days_to_keep=14)


Здесь учитывается стандартный шаблон именования логов и директорий, включающий дату и время. Я по привычке использую structlog для ведения логов.
  • 👍 26
  • 🔥 5
More from @dataeng
  1. Aug 23, 2026Официальная документация по Python теперь доступна на русском языке: https://blog.python.o…
  2. Jul 20, 2026PostgreSQL 18 изнутри Postgres Pro выпустили новую версию книги про устройство PostgreSQL:…
  3. Jul 16, 2026На канале Елизаветы Осетинской вышло интересное интервью с создателем ClickHouse Алексеем…
  4. Apr 30, 2026PostgreSQL 16: Оптимизация запросов 🖥 Вчера случайно заметил, что на Postgres Pro появила…
  5. Apr 29, 2026Эффективно управлять сложностью можно через абстракции. Например, через практики внедрения…
  6. Apr 29, 2026Отказоустойчивость железа достигается через добавление избыточных компонентов, например, в…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →