Airflow 1.9日志冗余问题:如何恢复1.7.1.3的简洁日志格式?
刚好我之前也处理过Airflow 1.x版本升级后的日志冗余问题,给你梳理一下对应的解决方案和知识点:
1. 如何恢复旧版简洁日志(隐藏base_task_runner日志)
Airflow 1.9里base_task_runner的日志来自airflow.task_runner这个logger,默认级别是INFO,所以会输出大量任务启动、执行环节的冗余日志。要回到1.7.1.3的简洁风格,核心是把这个logger的级别调高,过滤掉INFO级别的内容:
快速调整(部分版本适用):直接在
airflow.cfg的[logging]区块添加一行:logger_airflow.task_runner = WARNING保存后重启Airflow服务,这样只有
base_task_runner的警告和错误日志会显示,INFO级别的启动日志就被过滤了。可靠自定义配置:如果上面的方法不生效,就需要自定义日志配置:
- 新建一个Python文件(比如
custom_log_config.py),参考Airflow默认的日志配置(可以从Airflow源码的airflow.config_templates.default_logging模块里找到默认的LOGGING_CONFIG),复制到自己的文件中。 - 在配置的
loggers部分,添加或修改airflow.task_runner的配置:'airflow.task_runner': { 'level': 'WARNING', 'handlers': ['task'], 'propagate': False, }, - 在
airflow.cfg中指定自定义配置:logging_config_class = custom_log_config.LOGGING_CONFIG - 重启Airflow服务,之后任务日志就只会保留Bash Operator的执行内容了。
- 新建一个Python文件(比如
2. log_format与simple_log_format的区别
这两个参数控制的是日志输出的格式细节,核心差异在信息丰富度上:
log_format:是Airflow默认使用的详细格式,包含了日志产生的时间戳、logger名称、日志级别、进程/线程ID以及核心消息,比如默认格式可能是:
%(asctime)s - %(name)s - %(levelname)s - %(message)s这种格式适合持久化存储,方便后续排查问题时定位日志来源和上下文。
simple_log_format:是简化版格式,只保留最核心的信息,通常是时间戳、日志级别和消息内容,比如:
%(asctime)s %(levelname)s %(message)s它去掉了logger名称、进程ID等冗余信息,输出更简洁,适合在控制台快速预览日志,或者不需要太多上下文的场景。
3. 本地存储日志是否需要配置logging_config_class
默认情况下不需要,Airflow自带的默认日志配置已经完全支持本地文件存储,日志会自动存放在airflow.cfg中base_log_folder指定的目录下,无需额外配置。
只有当你有以下自定义需求时,才需要配置logging_config_class:
- 调整特定logger的日志级别(比如第一个问题中过滤
base_task_runner的日志); - 修改日志输出格式(自定义
log_format或simple_log_format的内容); - 添加额外的日志处理器(比如同时输出到文件和控制台,或者对接外部日志系统);
- 调整日志的滚动策略、保留期限等存储规则。
内容的提问来源于stack exchange,提问作者user974514

