添加日志模块
回顾
通过上篇内容,我们已经使用Fastapi完成了我们的第一个接口。我们可以看到,使用Fastapi来编写接口是十分简单的。那么接下来,我们丰富一下上面的例子。
需求
现在的需求来了,在我们平时的开发过程中,总会遇到一些问题。但是又不是必现的,所以我们可以通过一些手段来写入日志,去发现问题。一个很明显的例子就是try/exception,遇到未知问题的时候可以将问题记录至日志并在事后排查。日志模块的好处我简单列了几点,如下:
- 问题诊断和排查:系统运行时,可能会出现各种各样的异常情况,比如程序崩溃、数据错误、网络连接失败等等。这些问题很难在系统运行时直接定位和找到根本原因,但是通过记录日志,我们可以更好地了解问题所在,甚至可以提前预知可能出现的问题。
- 性能监控和优化:记录日志还可以帮助我们监控系统的性能和资源使用情况,比如 CPU 占用率、内存使用情况、网络延迟等等。通过分析日志,我们可以找到程序的瓶颈所在,并进行相应的优化。
- 调试和追踪:当系统出现问题时,我们需要迅速定位问题,这时候日志就显得尤为重要。通过记录程序的关键信息和执行流程,我们可以更好地了解代码的执行情况,找到问题所在,并进行相应的修复。
总之,日志模块在代码中的作用非常重要,它可以帮助我们更好地了解系统运行情况,并提供有价值的信息用于调试和优化。
日志模块选用
logging:
logging 是 Python 标准库中的模块,它提供了一个灵活的日志记录系统,可用于调试和错误分析。使用 logging,我们可以将应用程序的日志记录到文件、终端、远程服务器等多个地方,还可以选择日志级别和格式。
logbook:
logbook 是一个 Python 日志记录库,它提供了比标准库 logging 更加简单、灵活、可定制的日志记录功能。它支持多线程和多进程,并提供了不同的处理器和记录器,可以将日志记录到文件、终端、邮件等多个地方。
loguru:
loguru 是一个 Python 日志记录库,它提供了简单易用的接口,可以轻松地将日志记录到文件、终端、邮件等多个地方。它支持多线程和多进程,并提供了颜色输出、格式化等多种特性。在此,我选择的是loguru,因为用这个的时间最多最长,因此选择。
安装
在终端输入pip3 install loguru并回车。
编写代码
日志模块属于工具类,因此将之划分到app/utils/log_config.py下。
# 导入所需的模块和库
import os
from datetime import datetime
from loguru import logger
# 初始化日志记录器
def init_logger(log_file_path):
# 如果日志文件夹不存在,则创建它
if not os.path.exists(log_file_path):
os.makedirs(log_file_path)
# 获取当前时间并根据时间创建日志文件名
now = datetime.now()
log_file_name = f"{log_file_path}{now.strftime('%Y-%m-%d_%H')}.log"
# 添加日志记录器,设置日志文件的轮换和保留策略
logger.add(log_file_name, rotation="1 day", retention="7 days", enqueue=True)
# 记录日志,标记日志记录器已初始化
logger.info("Logger initialized.")
# 调用日志记录器初始化函数并传入日志文件夹路径
init_logger("logs/")
# 如果这个 Python 脚本是直接被执行的(而不是作为模块被导入的),则执行以下代码
if __name__ == "__main__":
# 什么也不做,直接跳过
pass
在main.py中使用日志
import uvicorn
from src.app import abandon
from src.app.utils.log_config import logger
@abandon.get('/')
def hello_world():
logger.debug('这是一条log信息')
return 'Hello Abandon!'
if __name__ == "__main__":
uvicorn.run(app=abandon, host='0.0.0.0', port=9923)
验证
启动服务访问http://localhost:9923
查看日志记录结果
- 控制台中有打印日志信息
- 查看项目目录下logs文件夹,文件夹中有时间分割的日志log文件。