如何程序化删除Docker部署的Apache 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

