如何制作 Prefect.io 格式的文件处理程序,以便日志条目就像 stdout

问题描述

我试图让一个文件处理程序创建的 Prefect.io 日志文件看起来与 Prefect.io 记录器打印的日志完全一样,但我只收到了消息。

代替

[2021-06-11 12:46:02-0700] INFO - prefect.FlowRunner | Beginning Flow run for 'test'
[2021-06-11 12:46:02-0700] INFO - prefect.TaskRunner | Task 'pull_project': Starting task run...
[2021-06-11 12:46:02-0700] INFO - prefect.pull_project | Pull latest test version from git.
[2021-06-11 12:46:02-0700] WARNING - prefect.pull_project | A warning message....
[2021-06-11 12:46:02-0700] INFO - prefect.TaskRunner | Task 'pull_project': Finished task run for task with final state: 'Success'
[2021-06-11 12:46:02-0700] INFO - prefect.FlowRunner | Flow run SUCCESS: all reference tasks succeeded

在日志文件中我看到

Beginning Flow run for 'test'
Task 'pull_project': Starting task run...
Pull latest test version from git.
A warning message....
Task 'pull_project': Finished task run for task with final state: 'Success'
Flow run SUCCESS: all reference tasks succeeded

代码

from datetime import timedelta,datetime
from prefect import task,Flow,Parameter
import prefect
import logging
from prefect.utilities.logging import get_logger
from pathlib import Path
import os


SRC_PATH = os.path.dirname(__file__)
LOG_PATH = os.path.join(Path(SRC_PATH).parents[0],'logs')


class MyFileLogger(logging.FileHandler):

    def __init__(self,filename,mode='a',encoding=None,delay=False):
        filename = os.path.join(LOG_PATH,filename)
        super(MyFileLogger,self).__init__(filename,mode,encoding,delay)
        # logging.Formatter = "[%(asctime)s] %(levelname)s - %(name)s | %(message)s"


@task(max_retries=3,retry_delay=timedelta(seconds=1),name='pull_project',log_stdout=True)
def pull_project(project_name):
    logger = prefect.context.get("logger")
    logger.info(f"Pull latest {project_name} version from git.")
    logger.warning("A warning message....")
    return {'project_name': project_name}


def main():
    with Flow("test") as flow:
        project_info = pull_project(project_name='test')


    file_logger = get_logger()
    file_logger.addHandler(MyFileLogger('auto_ai.log'))

    flow.run()



if __name__ == "__main__":
    main()

关于如何使日志文件镜像标准输出的任何建议?

解决方法

MyFileLogger 更改为

class MyFileLogger(logging.FileHandler):

    def __init__(self,filename,mode='a',encoding=None,delay=False):
        filename = os.path.join(LOG_PATH,filename)
        super(MyFileLogger,self).__init__(filename,mode,encoding,delay)
        self.setFormatter(logging.Formatter("[%(asctime)s] %(levelname)s - %(name)s | %(message)s"))

解决了问题