4

为什么我在记录时 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”不会自动生成。还有其他配置吗?

4

5 回答 5

4

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

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

要配置 Uvicorn 日志记录,您需要使用将配置传递给 Uvicorn 作为 dict 配置或文件配置,如https://docs.python.org/3/library/logging.config.html#logging.config.dictConfighttps中所述://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

于 2021-04-29T03:16:58.007 回答
1

我想知道如何让 FastAPI 同时登录到文件和控制台。Pratik 的回答让我大部分时间都在那里,但我发现 Uvicorn 只是记录到文件中。至少,当 Uvicorn 像这样集成到我的主脚本中时,情况就是这样:

if __name__ == "__main__":
    cwd = pathlib.Path(__file__).parent.resolve()
    uvicorn.run(app, host="0.0.0.0", port=5000, log_config=f"{cwd}/log.ini")

因此,我想我会为尝试登录控制台和文件时可能遇到相同问题的任何人分享我的适应解决方案。

[loggers]
keys=root

[handlers]
keys=logfile,logconsole

[formatters]
keys=logformatter

[logger_root]
level=INFO
handlers=logfile, logconsole

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

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

[handler_logconsole]
class=handlers.logging.StreamHandler
level=INFO
args=()
formatter=logformatter
于 2021-11-02T11:58:17.633 回答
1

我认为问题在于您使用的是 fastapi 记录器,但也有uvicorn.erroruvicorn.access记录uvicorn器,尝试将处理程序添加到此记录器

于 2020-08-27T15:30:46.613 回答
0

你可以试试这段代码,我在 Python 3.9.5 上:

import logging

# create log file
logging.basicConfig(filename='mylog.log', encoding='utf-8', level=logging.DEBUG)

# add worning info and error
logging.debug('go to log file')
logging.info('for informations')
logging.warning('and this for worning')
logging.error('for error')
于 2021-10-28T12:03:45.103 回答
-1

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

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.')
于 2021-01-06T19:05:55.017 回答