首页 > 解决方案 > Python Flask 记录到多个文件

问题描述

我有一个烧瓶应用程序,它从 2 个不同的文件中调用 2 个函数。我已将日志记录设置到 2 个不同的文件。但是,日志记录似乎总是附加到一个文件(无论哪个端点首先命中)

这是文件的结构 -

from file1 import fun1
from file2 import fun2
 
@app.route("/end_point1")
def data_1:
    return fun1()
     
@app.route("/end_point2")
def data_2:
    return fun2()
import logging

def fun1:
    logging.basicConfig(filename = "file1.log")
    logging.info("Logging function 1 details to to file1")
    return foo
def fun2:
    logging.basicConfig(filename = "file2.log")
    logging.info("Logging function 2 details to to file2")
    return bar

当我运行单个 python 文件 - file1.py / file2.py 时,这记录很好(单独)但是当我运行 API 时,日志只附加到一个文件中。

我在日志记录方面做错了什么?我该如何解决?

标签: flaskloggingpython-3.7flask-adminlogfile

解决方案


将此添加到 logger_setup.py

import logging
from pathlib import Path
formatter = logging.Formatter('%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s')


def setup_logger( name, log_file, level=logging.DEBUG): 

    my_file = Path(log_file)
    # print("check the if condition for the file")
    # print(my_file.is_file())

    if my_file.is_file():
        #print(logging.getLogger(name).hasHandlers())
        # if logging.getLogger(name).hasHandlers():
        if len(logging.getLogger(name).handlers)>0:
            return logging.getLogger(name)
        else:
            handler = logging.FileHandler(log_file, mode='a')        
            handler.setFormatter(formatter)
            logger = logging.getLogger(name)
            logger.setLevel(level)
            logger.addHandler(handler)
            logger.propagate = False
            return logger
    else:
        handler = logging.FileHandler(log_file, mode='a')        
        handler.setFormatter(formatter)

        logger = logging.getLogger(name)
        logger.setLevel(level)
        logger.addHandler(handler)
        logger.propagate = False
        return logger

在 file1 和 2 中,您可以使用类似这样的内容

import logging
import logger_setup

def fun1():
    log_location = 'logs'
    logger = logger_setup.setup_logger(__name__,log_location+__name__+'.log')
    logger.info("Logging function 1 details to to file1")
    return "1"

推荐阅读