移除Airflow调度器日志

21

我正在使用Docker Apache Airflow版本1.9.0-2 (https://github.com/puckel/docker-airflow)。

调度程序生成了大量的日志,文件系统很快就会耗尽空间,因此我正在尝试通过编程方式删除由airflow创建的调度程序日志,这些日志位于调度程序容器中 (/usr/local/airflow/logs/scheduler)。

我已经设置好了所有这些维护任务:https://github.com/teamclairvoyant/airflow-maintenance-dags

然而,这些任务只会在worker上删除日志,而调度程序日志位于调度程序容器中。

我还设置了远程日志记录,将日志发送到S3,但如在此SO帖子中提到的Removing Airflow task logs,此设置无法阻止airflow写入本地机器。

此外,我还尝试创建一个共享命名卷,介绍如下Docker Compose - Share named volume between multiple containers。 然而,在worker中出现以下错误:

ValueError: Unable to configure handler 'file.processor': [Errno 13] Permission denied: '/usr/local/airflow/logs/scheduler'

在scheduler中出现以下错误:

ValueError: Unable to configure handler 'file.processor': [Errno 13] Permission denied: '/usr/local/airflow/logs/scheduler/2018-04-11'

那么,人们如何删除调度程序日志呢?

4个回答

11

这个 回复的启发,我添加了来自 这里airflow-log-cleanup.py DAG(对其参数进行了一些更改)以删除所有旧的airflow日志,包括调度程序日志。

我的更改很小,不过鉴于我的EC2磁盘大小(/dev/xvda1为7.7G),默认值为30天的DEFAULT_MAX_LOG_AGE_IN_DAYS似乎太大了,所以(我有4个DAGs)我将其更改为14天,但根据您的环境随意调整:

DEFAULT_MAX_LOG_AGE_IN_DAYS = Variable.get("max_log_age_in_days", 30) 更改为 DEFAULT_MAX_LOG_AGE_IN_DAYS = Variable.get("max_log_age_in_days", 14)


4
这篇针对"Removing Airflow Task logs"问题的回答同样适用于Airflow 1.10下的使用场景。
基本上,你需要实现一个自定义日志处理程序,并配置Airflow日志记录以使用该处理程序而不是默认处理程序(请参阅Airflow源代码库中的UPDATING.md,而不是README或文档!!)。
有一点需要注意:由于日志记录、多进程和Airflow默认处理程序交互的方式,重写处理程序方法比通过调用超类在派生处理程序类中扩展处理程序更安全,因为Airflow默认处理程序不使用锁。

4

以下是解决此问题的一种选项。

使用以下机制登录到Docker容器

#>docker exec -it <name-or-id-of-container> sh

在运行上述命令时,请确保容器正在运行。

然后使用cron作业在这些日志文件上配置定期的rm命令。


定时任务参考:https://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/ - fly2matrix
哈,我昨晚其实也在考虑类似的事情……我只是不太愿意让 cron 任务在我的调度器后面清理 lol……我认为还可以通过在容器之间共享文件夹来解决问题,但我缺乏 Docker 和 Airflow 的知识。感谢您的建议! - Ryan Stack
最终我添加了这个命令 /usr/local/bin/docker-compose exec -T scheduler bash -c "rm -rf /usr/local/airflow/logs/scheduler/*" 并使用以下 cron 表达式运行它 0 0 * * * cd /path/to/script && /bin/bash ./cleanup.sh 1> /tmp/success.txt 2> /tmp/err.txt - Ryan Stack

0

我花了很多时间尝试添加“维护”DAG,以清除由不同的Airflow组件作为Docker容器启动生成的日志。

问题实际上更多地出现在Docker层面上,每个进程都负责大量的日志,默认情况下,这些日志由Docker存储在json文件中。解决方案是更改日志驱动程序,使日志不再存储在Docker主机实例上,而是直接发送到AWS CloudWatch Logs(在我的情况下)。

我只需要将以下内容添加到docker-compose.yml文件中的每个服务中(https://github.com/puckel/docker-airflow):

    logging:
      driver: awslogs
      options:
        awslogs-group: myAWSLogsGroupID

请注意,我的“docker-compose” Airflow 应用程序正在运行的 EC2 实例具有一个 AWS 角色,允许她创建日志流和添加日志事件(在 AWS IAM 服务中执行 CreateLogStreamPutLogEvents 操作)。

如果您在 AWS 生态系统之外的机器上运行它,则需要确保它具有通过凭据访问 AWS 的权限


实际上,您可以轻松旋转docker日志。因此,这不是由docker引起的,您的解决方案根本无法解决调度程序日志问题。 - qichao_he

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接