我通常会在我的 python 脚本中创建一个全局 logger
,然后在我所有函数的日志中写入我自己的消息。我知道 Airflow 有自己的日志记录功能,但我发现它们太冗长而无法完成。有没有办法为所有任务创建我自己的日志记录功能,这样日志只包含我的自定义日志消息?
答案 0 :(得分:1)
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(这是唯一的“特定于气流的”部分)中,您有一个预定义的配置(它应该保持原样),但您可以使用自己的自定义日志记录配置轻松扩展它。< /p>
您可以使用以下内容创建一个名为 ${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 库。