Logging.日志
日志配置
Prefect具有多种从task生成日志的方式。
Prefect内置Logger
Prefect的日志级别由prefect.config.logging.level控制,默认为INFO。但是设置只会影响Prefect内置logger对象,而不是Python全局的logger对象。
要更改默认日志级别,请设置环境变量PREFECTLOGGINGLEVEL=DEBUG。
task记录日志
要访问Prefect配置的logger对象,请使用prefect.utilities.logging.get_logger(<名称可选>)。如果你不提供名称,将收到Prefect的根logger对象。
task类
在task类里面使用self.logger:
class MyTask(prefect.Task):
def run(self):
self.logger.info("An info message.")
self.logger.warning("A warning message.")
task装饰器
在@task装饰器生成的task的实例运行里,从上下文获取logger:
@task
def my_task():
logger = prefect.context.get("logger")
logger.info("An info message.")
logger.warning("A warning message.")
确保仅在task运行时访问上下文
运行task时,将填充Prefect上下文信息。因此,仅应在task运行时访问上下文的logger对象。例如,将无法工作的一个实例:
logger = prefect.context.get("logger") @task def my_task(): logger.info("An info message.") logger.warning("A warning message.")
日志输出
Prefect的task本身就支持将标准输出的输出转发到logger对象。可以通过在task上设置log_stdout=True来启用此功能。
@task(log_stdout=True)
def log_my_stdout():
print("I will be logged!")
其他Logger库
当使用日志配置时,可以设置许多其他库(例如boto3和snowflake.connector)发出自己的内部日志。你甚至可以为团队使用具有相同日志功能提供内部共享库。
如果通过标准日志库执行此操作,则可以执行以下操作:
import logging
import sys
for l in ['snowflake.connector', 'boto3', 'custom_lib']:
logger = logging.getLogger(l)
logger.setLevel('INFO')
log_stream = logging.StreamHandler(sys.stdout)
log_stream.setFormatter(LOG_FORMAT)
logger.addHandler(log_stream)
鉴于Prefect已经提供了一种配置本地日志和云日志记录的方法,你可以使用这些第三方的日志库,以使它们继承Prefect日志记录配置以在本地流传输并显示在云端。
为了使其正常工作,你需要提供一个列表至prefect.config.logging.extra_loggers。
这是TOML配置的样子:
[logging]
# Extra loggers for Prefect log configuration
extra_loggers = "['snowflake.connector', 'boto3', 'custom_lib']"
当做环境变量配置:
export PREFECT__LOGGING__EXTRA_LOGGERS="['snowflake.connector', 'boto3', 'custom_lib']"
Last updated
Was this helpful?