大家好,我是somenzz,可以叫我郑哥。最近在使用FastAPI的时候,发现FastAPI的官方文档并没有配置日志的说明。今天分享一下FastAPI的配置日志。三种方法中。第一种方法是像写脚本一样记录日志。这种方法最简单直接。写脚本时如何记录日志就是这里如何记录日志。通常,先配置日志格式,然后在需要的地方配置logger.info。:配置日志记录:importlogginglogger=logging.getLogger()logger.setLevel(logging.INFO)ch=logging.StreamHandler()fh=logging.FileHandler(filename='./server.log')formatter=logging.Formatter("%(asctime)s-%(module)s-%(funcName)s-行:%(lineno)d-%(levelname)s-%(message)s")ch.setFormatter(formatter)fh.setFormatter(formatter)logger.addHandler(ch)#将日志输出到屏幕logger.addHandler(fh)#将日志输出到文件如果怕文件太大,可以使用循环日志:fh=logging.handlers.RotatingFileHandler("api.log",mode="a",maxBytes=100*1024,backupCount=3)然后,添加logger.info/logger.warning/logger.debug/logger.errorfromfastapiimportFastAPI#setuploggersimport日志记录器=日志记录。getLogger()logger.setLevel(logging.INFO)ch=logging.StreamHandler()fh=logging.FileHandler(filename='./server.log'))ch.setFormatter(LogFormatter())fh.setFormatter(LogFormatter())logger.addHandler(ch)#输出日志到屏幕logger.addHandler(fh)#输出日志到文件app=FastAPI()@app.get("/")asyncdefroot():logger.info("loggingfromtherootlogger")return{"status":"alive"你可能会说,我有很多接口,是不是应该逐行添加?那不是必须的,你可以在中间件中拦截所有请求,然后记录每个请求。完整代码如下:文件名main.py,重点是log_requests函数:fh=logging.FileHandler(filename='./server.log')formatter=logging.Formatter("%(asctime)s-%(module)s-%(funcName)s-line:%(lineno)d-%(levelname)s-%(message)s")ch.setFormatter(formatter)fh.setFormatter(formatter)logger.addHandler(ch)#输出日志到屏幕logger.addHandler(fh)#输出日志到文件logger=logging.getLogger(__name__)app=FastAPI()@app.middleware("http")asyncdeflog_requests(request,call_next):idem=''.join(random.choices(string.ascii_uppercase+string.digits,k=6))logger.info(f"rid={idem}开始请求路径={request.url.path}")start_time=time.time()response=awaitcall_next(request)process_time=(time.time()-start_time)*1000formatted_process_time='{0:.2f}'.format(process_time)logger.info(f"rid={idem}completed_in={formatted_process_time}msstatus_code={response.status_code}")returnresponse@app.get("/")asyncdefroot():return{"status":"alive"}命令行uvicornmain:app--host0.0.0.0--port8081然后访问http://localhost:8081,会看到日志输出,同时会保存在server.log文件中:第二种,日志fastapi记录的uvicorn其实是由uvicorn驱动的,uvicorn本身会在终端输出信息:?uvicornmain:app--host0.0.0.0--port8081INFO:Startedserverprocess[88064]INFO:Waitingforapplicationstartup.INFO:Applicationstartupcomplete.INFO:Uvicornrunningonhttp://0.0.0.0:8081(PressCTRL+Ctoquit)将这些信息记录到一个文件中,并在fastapi启动时配置它:@app.on_event("startup")async定义之星tup_event():记录器=logging.getLogger("uvicorn.access")handler=logging.handlers.RotatingFileHandler("api.log",mode="a",maxBytes=100*1024,backupCount=3)handler.setFormatter(logging.Formatter("%(asctime)s-%(levelname)s-%(message)s"))logger.addHandler(handler)这样uvicorn的输出会记录在api.log中第三种方式是配置uvicorn的日志。如果你这样运行FastApi:app=FastAPI()uvicorn.run(app,host="0.0.0.0",port=8000)那么你可以在代码中配置uvicorn的log,然后在运行函数:log_config=uvicorn.config.LOGGING_CONFIGlog_config["formatters"]["access"]["fmt"]="%(asctime)s-%(levelname)s-%(message)s"log_config["formatters"]["default"]["fmt"]="%(asctime)s-%(levelname)s-%(message)s"uvicorn.run(app,log_config=log_config)当然配置文件也可以在命令行中通过uvicorn--log-config=log.ymal传入:version:1formatters:simple:format:'%(asctime)s-%(name)s-%(levelname)s-%(message)s'handlers:console:class:logging.StreamHandlerlevel:DEBUGformatter:simplestream:ext://sys.stdoutloggers:simpleExample:level:DEBUGhandlers:[console]propagate:noroot:level:DEBUGhandlers:[console]日志文件支持.ini、.json、.yaml格式。最后,本文分享三种FastAPI配置日志的方式,后两种其实就是uvicorn的配置和日志方式。
