Airflow 中的自定义日志记录

Custom logging in Airflow

我通常会在我的 python 脚本中创建一个全局 logger,然后在我所有函数的日志中写入我自己的消息。我知道 Airflow 有自己的日志记录功能,但我发现它们太冗长了,无法通过。有没有办法为所有任务创建我自己的日志记录功能,以便日志只包含我的自定义日志消息?

Airflow 使用绝对标准的 Python 日志记录功能,可以满足您的所有需求。我建议你不要重新发明轮子,而是使用那里的东西

https://docs.python.org/3/library/logging.html

你应该如何处理你应该创建你自己的命名记录器并在那里记录你的消息,并配置记录器来做任何需要用它做的事情(打印到文件,将它发送到 cloudwatch 或 stackdriver 等.)

通常 Python 中的记录器(这不是“气流”方法 - 这是所有现代 python 程序遵循的绝对标准方法)是记录器是使用以下命名创建的 python 包。

这是您通常会在 Python 模块中看到的内容:

logger = logging.getLogger(__name__)

Python 中的记录器是分层的,其中树层次结构由“.”分隔。所以这有一个很好的优势,你可以为“包+所有子包递归地”配置记录器属性 - 例如你可以通过配置“气流”记录器为所有“气流”子包设置日志记录。

再说一次 - 这没什么“特别”的。所有现代 Python 程序都这样做。

你也可以,如果你想配置你自己的记录器而不是遵循“包”。这更像是一种约定,但并未强制执行。

所以在你的程序中,dag,无论你能写什么:

my_logger = logging.getLogger("MY_CUSTOM_LOGGER")

并在 Python 中使用记录器附带的所有好东西:my_logger.info(...)、warn(...)、传递异常等

现在,关键是“配置”输出。 Python 日志记录(同样,这并不是“气流的特殊之处”,您可以配置记录器打印输出的位置以及方式,完全独立于定义记录器的位置 - 通过提供记录器配置。

在 Airflow 中(这是唯一的“特定于气流的”部分),您有一个预定义的配置(它应该保持原样),但您可以使用自己的自定义日志记录配置轻松扩展它.

此处描述:https://airflow.apache.org/docs/apache-airflow/stable/logging-monitoring/logging-tasks.html#advanced-configuration

您的方法是创建一个名为 ${AIRFLOW_HOME}/config/log_config.py 的文件,内容如下:

from copy import deepcopy
from airflow.config_templates.airflow_local_settings import DEFAULT_LOGGING_CONFIG

LOGGING_CONFIG = deepcopy(DEFAULT_LOGGING_CONFIG)

# Here your custom configuration follows
LOGGING_CONFIG['formatters']['MY_CUSTOM_FORMATTER'] = {
  ...
  "class": "logging.Formatter",
  ...
}
LOGGING_CONFIG['handlers']['MY_CUSTOM_HANDLER'] = {
  .. 
  "formatters" : "MY_CUSTOM_FORMATTER",
  ..
}
LOGGING_CONFIG['loggers']['MY_CUSTOM_LOGGER'] = {
  "handlers" : "MY_CUSTOM_HANDLER",
  "level": logging.INFO
}

同样 - 除了需要深度复制原始配置以确保 Airflow 任务以网络服务器可以看到它们的方式发送日志,从而自动屏蔽秘密等等之外,没有什么“airlfow-special”。

这是纯粹的 python 标准方法 - 来自标准 python 库。