FATE Flow 源码解析 - 日志输出机制

背景介绍

之前的文章 中介绍了 FATE 的作业处理流程,在实际的使用过程中,为了查找执行中的异常,需要借助运行生成的日志,但是 FATE-Flow 包含的流程比较复杂,对应的日志也很多,而且分散在不同的文件中,在这篇文章中就对 FATE-Flow 的日志机制进行梳理,帮助大家了解 Python 服务中实现一个更加灵活的日志机制

logging 机制

FATE-Flow 中日志主要基于 Python 原生的 logging 机制实现,也正是依靠强大而灵活的 logging 机制,FATE-Flow 才实现了丰富的日志查询能力,基础的 logging 知识可以自行查看官方文档

为了了解 FATE-Flow 的日志实现机制,涉及的一个关键概念就是 Handler, Handler 是实际处理日志的模块,在 logging 中被设计为可插拔模式的,可以根据需要进行注册。举一个简单的例子进行介绍:

# 创建一个 logger 对象

logger = logging.getLogger(name)

# 注册日志处理器 handler1, 将日志输出至 a.log 文件中

handler1 = TimedRotatingFileHandler("a.log")
logger.addHandler(handler1)

# 注册日志处理器 handler2, 将日志输出至 b.log 文件中

handler2 = TimedRotatingFileHandler("b.log")
logger.addHandler(handler2)

# 实际输出日志

logger.info("test log")

在上面的例子中会基于 logging 机制创建出日志实例 logger ,并注册了两个 Handler,后续输出的日志就会依次被两个 Handler 进行处理,即日志最终会输出至文件 a.logb.log 中,而且在实际运行中可以动态调整 Handler,从而动态调整日志处理方式,因此可以实现极其灵活的日志输出方式

理解了这个机制,就很容易理解 FATE-Flow 如何实现将同样的日志内容按照日志类型输出至 fate_flow_schedule.logfate_flow_audit.log 文件中,同时又按照日志等级输出至 DEBUG.log, INFO.log, WARNING.log, ERROR.log 文件中了。FATE-Flow 就是通过添加不同的 Handler 实现的

FATE-Flow 日志

FATE-Flow 的日志主要存在于 /data/projects/fate/fateflow/logs 目录下,在此目录下主要分为两种类型的日志目录:

  1. fate_flow 目录,其中包含整体的 FATE-Flow 日志;
  2. 独立 job 目录的日志,此时会以 job_id 为单位输出所有相关的日志至特定目录中;
    最终展示的效果如下所示:

请添加图片描述

其中数字部分是以 job 为单位的日志,右侧 fate_flow 就是 FATE-Flow 整体的日志

其中 fate_flow 中主要是如下所示的日志:

  • DEBUG.log
  • ERROR.log
  • INFO.log
  • WARNING.log
  • fate_flow_access.log
  • fate_flow_audit.log
  • fate_flow_database.log
  • fate_flow_detect.log
  • fate_flow_schedule.log
  • fate_flow_stat.log
  • stat.log

注意这部分日志因为量可能可能比较大,因此 FATE-Flow 中是按天进行分片,因此最终的效果如下所示的:

请添加图片描述

而 按照 job_id 为单位的日志主要包含如下所示的日志:

  • fate_flow_audit.log
  • fate_flow_schedule_error.log
  • fate_flow_schedule.log
  • fate_flow_sql.log
  • guest (目录)
  • host (目录)

其中 guest/host 是按照 job 执行中参与的角色为单位输出的日志,后续介绍中再进一步展开

实现原理

下面按照目录分别介绍 FATE-Flow 不同模块的的日志输出相关的实现

fate_flow 目录日志

fate_flow 目录下的日志分为按照类型的日志 fate_flow_schedule.log, fate_flow_audit.log 等,同时也包含按照日志等级的 DEBUG.log, INFO.log, WARNING.log, ERROR.log
事实上,这两种类型的日志中的内容可能有很多相同的内容,只是按照不同维度区分后放在不同的文件中,比如想查询任务调度相关的日志,可以去查询 fate_flow_schedule.log,而想查询执行中警告相关的日志,可以去查询 WARNING.log, 而任务调度中也可能有处于警告级别的日志,此时在两个文件中都可能会存在。

我们可以先类型相关的日志是如何存入的,这边以 fate_flow_schedule.log 为例进行解释:
此日志使用的是 fate_flow/utils/log_utils.py 中的 schedule_logger() 方法进行日志输出,对应输出至 fate_flow 目录相关的代码如下:

def schedule_logger(job_id=None, delete=False):
    if not job_id:
        return getLogger("fate_flow_schedule")

此时调用的是 fate_arch/common/log.py 中的 getLogger() 方法去获取对应日志实例 logger, 最终会调用 LoggerFactory.init_logger() 初始化日志实例,对应的代码如下所示:

def init_logger(class_name):
    # 初始化日志实例 logger,此时对应的 class_name 为 fate_flow_schedule

    logger = LoggerFactory.new_logger(class_name)

    # 创建 logger 对应的 Handler,此 Handler 负责将日志输出至对应文件中

    handler = LoggerFactory.get_handler(class_name)

    # 将 handler 添加至 logger 中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易迟

高质量内容创作不易,支持下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值