日志
约 682 字大约 2 分钟
2026-09-10
使用什么日志库?
在python中,通常使用loguru记录日志
from loguru import logger
import sys
# 1. 移除默认的输出配置
logger.remove()
# 2. 配置控制台输出(彩色、格式化)
logger.add(
sys.stdout,
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{extra[request_id]}</level> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
level="DEBUG",
colorize=True,
)
# 3. 输出日志
logger.bind(request_id="abc-123", user="admin").info("开始处理请求")logger.add- 参数
1:配置日志输出方式,通常为sys.stdout或文件路径 - 参数
format: 配置日志输出格式 - 参数
level: 配置日志级别- TRACE:跟踪级别
- DEBUG:调试级别
- INFO:信息级别
- SUCCESS:操作成功级别
- WARNING:警告级别
- ERROR:错误级别
- CRITICAL:严重错误级别
- 参数
logger.bind:绑定额外的自定义信息logger.info:输出INFO级别的消息
日志配置
日志配置什么时候做?
在系统启动的时候完成配置,同时由于使用了日志系统,因此uvicorn的错误信息不再打印到控制台
配置什么?
生产环境:
- 输出方式:固定为
stdout,方便后期和云服务日志系统对接 - 输出级别:通过环境变量配置
- 输出格式:统一为
JSON,方便云服务日志系统解析
开发环境:
输出方式:
固定为
stdout,打印到控制台对于错误日志,还要额外输出到文件
输出级别:通过环境变量配置
输出格式:统一为纯文本,方便人类阅读
日志输出
输出什么?
共同数据:
- message:错误消息
- duration_ms:某个操作执行的时间(毫秒)
差异数据:
- 请求日志:method、path、status_code、client_ip
- 数据库日志:sql、params
- 业务日志:action、entity、entity_id
可以使用类结构约定字段
在哪里输出?
请求日志
使用请求中间件
- 请求到达后:
- 记录请求id到上下文,使得该请求链条中的所有日志都可以拿到该id
- 创建请求日志对象
- 将日志对象放置到
request.state.request_log中,方便其他地方获取日志对象
- 请求成功:
log.success() - 请求失败
- 进入
handler的处理逻辑 - 该写
message 500错误输出error,其他错误输出warning
- 进入
数据库日志
注册SQLAchemy事件监听器,执行SQL前计时,执行后创建日志对象
对于一些慢查询(超过环境变量的阈值),输出warning级别的日志
业务日志
通常不会全量的记录业务日志。
业务日志既可以统一处理,也可以灵活处理。
统一处理:使用装饰器,见business_log.py:service_logger
