为什么在我登录时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那样自动生成。还有其他配置吗?
答案 0 :(得分:0)
我认为问题在于您使用fastapi记录器,但是还有uvicorn.error
,uvicorn.access
和uvicorn
记录器,请尝试向此记录器添加处理程序
答案 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.')