FASTAPI日志记录到文件

时间:2020-03-17 01:52:49

标签: python fastapi

为什么在我登录时FastAPI不创建日志文件

这是我使用的代码

from fastapi.logger import logger as fastapi_logger
from logging.handlers import RotatingFileHandler
import logging

formatter = logging.Formatter(
        "[%(asctime)s.%(msecs)03d] %(levelname)s [%(thread)d] - %(message)s", "%Y-%m-%d %H:%M:%S")
handler = RotatingFileHandler('logfile.log', backupCount=0)
logging.getLogger("fastapi")
fastapi_logger.addHandler(handler)
handler.setFormatter(formatter)

fastapi_logger.info('****************** Starting Server *****************')

文件'logfie.log'不会像flask那样自动生成。还有其他配置吗?

3 个答案:

答案 0 :(得分:0)

我认为问题在于您使用fastapi记录器,但是还有uvicorn.erroruvicorn.accessuvicorn记录器,请尝试向此记录器添加处理程序

答案 1 :(得分:0)

您需要通过某些服务器运行 FastAPI,例如 Uvicorn、Hypercorn 或 AsyncIO

即使可能在您的 FastAPI 文件中正确配置了日志记录,您还是通过服务器运行应用程序。您不需要在 FastAPI 级别配置处理程序。只需使用 logger.info,您的日志就会发送到服务器。

要配置 Uvicorn 日志记录,您需要使用传递配置到 Uvicorn 作为 dict 配置或文件配置,如 https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig 中所述 和https://www.uvicorn.org/settings/#logging

这是一个示例 log.ini 文件

[loggers]
keys=root

[handlers]
keys=logfile

[formatters]
keys=logfileformatter

[logger_root]
level=INFO
handlers=logfile

[formatter_logfileformatter]
format=[%(asctime)s.%(msecs)03d] %(levelname)s [%(thread)d] - %(message)s

[handler_logfile]
class=handlers.RotatingFileHandler
level=INFO
args=('logfile.log','a')
formatter=logfileformatter

然后将其用作 uvicorn example:app --log-config /path/to/log.ini

Hypercorn 和 AsyncIO 有自己的方式来传递配置对象 https://docs.python.org/3/library/asyncio-dev.html

答案 2 :(得分:-1)

我不知道如何使用 fastAPI 记录器,但使用 Python 中的 logging 似乎很相似,并且可以自动生成您命名的日志文件。例如:

import logging

def get_logger(name, level=logging.DEBUG) -> logging.Logger:
    FORMAT = "[%(levelname)s  %(name)s %(module)s:%(lineno)s - %(funcName)s() - %(asctime)s]\n\t %(message)s \n"
    TIME_FORMAT = "%d.%m.%Y %I:%M:%S %p"

    FILENAME = 'example/path/log.log'

    logging.basicConfig(format=FORMAT, datefmt=TIME_FORMAT, level=level,
    filename=FILENAME
    )

    logger = logging.getLogger(name)
    return logger

#in any file that import fn get_logger, you can set up local logger like:
local_logger = get_logger(__name__)

local_logger.info(f'I am a local logger. I am writing to file {FILENAME}. If that file did not exist, it would be automatically created.')