You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何程序化删除Docker部署的Apache Airflow 1.9.0-2调度器日志?

解决Airflow 1.9.0-2调度器日志占满磁盘的问题

你遇到的问题很典型——那些官方维护DAG默认只清理任务执行日志,而Airflow调度器本身生成的日志(就是你提到的/usr/local/airflow/logs/scheduler路径下的文件)不在它们的清理范围内。下面给你几个实操性强的解决方案,按优先级排序:

1. 给调度器容器添加定时清理任务

这是最直接的办法,因为Airflow 1.x本身没有内置的调度器日志清理机制。你可以通过修改docker-compose.yml来持久化这个定时任务,避免容器重启后丢失:

  • 首先,创建一个简单的shell脚本clean_scheduler_logs.sh,内容如下:
#!/bin/bash
# 删除7天前的调度器日志文件,可根据需要调整+7的数值
find /usr/local/airflow/logs/scheduler -type f -mtime +7 -delete

给脚本加执行权限:chmod +x clean_scheduler_logs.sh

  • 然后,在docker-compose.yml的scheduler服务里,添加一个volume挂载这个脚本,同时修改启动命令,让容器启动时启动cron服务:
services:
  scheduler:
    ... # 保留原有配置
    volumes:
      - ./clean_scheduler_logs.sh:/usr/local/bin/clean_scheduler_logs.sh
    command: >
      bash -c "
      echo '0 0 * * * /usr/local/bin/clean_scheduler_logs.sh' >> /etc/crontab &&
      cron &&
      airflow scheduler
      "

这样每天凌晨0点,cron就会自动执行清理脚本。

2. 调整Docker日志驱动,避免容器本身的日志溢出

别忘了,Airflow调度器的日志除了写到logs/scheduler目录,还可能输出到容器的stdout/stderr,被Docker默认的日志驱动保存下来。你可以在docker-compose.yml里给scheduler服务添加日志限制:

services:
  scheduler:
    ... # 保留原有配置
    logging:
      driver: "json-file"
      options:
        max-size: "10m"  # 单个日志文件最大10MB
        max-file: "3"     # 最多保留3个日志文件

这样Docker会自动轮转容器日志,不会让它无限膨胀。

3. 扩展现有维护DAG,覆盖调度器日志路径

如果你想通过Airflow本身的DAG来统一管理,可以修改你部署的维护DAG,让它包含调度器日志路径。比如找到清理日志的PythonOperator代码,把清理路径从任务日志目录扩展到/usr/local/airflow/logs/scheduler:

举个例子,修改DAG里的清理函数:

def clean_old_logs(**context):
    import os
    from datetime import datetime, timedelta

    # 定义要清理的路径列表,包含调度器日志
    log_paths = [
        '/usr/local/airflow/logs/scheduler',
        '/usr/local/airflow/logs'  # 原任务日志路径
    ]
    retention_days = 7
    cutoff_date = datetime.now() - timedelta(days=retention_days)

    for path in log_paths:
        if not os.path.exists(path):
            continue
        for root, dirs, files in os.walk(path):
            for file in files:
                file_path = os.path.join(root, file)
                file_mtime = datetime.fromtimestamp(os.path.getmtime(file_path))
                if file_mtime < cutoff_date:
                    os.remove(file_path)

这样维护DAG执行时就会同时清理任务日志和调度器日志了。

4. 调整Airflow配置,减少调度器日志输出(可选)

如果日志生成速度实在太快,你可以在airflow.cfg里降低调度器的日志级别,比如把scheduler的日志级别从INFO改成WARNING,减少不必要的日志输出:

[core]
logging_level = WARNING

不过这一步要谨慎,避免错过重要的调度器报错信息。


内容的提问来源于stack exchange,提问作者Ryan Stack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:57:43