21-Loguru日志系统:分布式应用的调试利器

36 阅读1分钟

Loguru日志系统:分布式应用的调试利器

前言

良好的日志系统是生产环境调试的关键。本文介绍如何使用Loguru构建结构化日志系统。

适合读者: 后端开发者、运维工程师


一、Loguru配置

# logger.py
from loguru import logger
import sys

# 移除默认handler
logger.remove()

# 添加控制台输出
logger.add(
    sys.stdout,
    format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
    level="INFO"
)

# 添加文件输出
logger.add(
    "logs/app_{time:YYYY-MM-DD}.log",
    rotation="1 day",      # 每天轮转
    retention="30 days",   # 保留30天
    compression="zip",     # 压缩旧日志
    level="DEBUG"
)

# 添加错误日志
logger.add(
    "logs/error_{time:YYYY-MM-DD}.log",
    rotation="1 day",
    retention="90 days",
    level="ERROR"
)

二、日志使用

from logger import logger

# 基础日志
logger.debug("调试信息")
logger.info("普通信息")
logger.warning("警告信息")
logger.error("错误信息")
logger.critical("严重错误")

# 带上下文的日志
logger.bind(user_id=123).info("用户登录")

# 异常日志
try:
    1 / 0
except Exception as e:
    logger.exception("发生异常")

三、请求日志中间件

# middleware/logging.py
from fastapi import Request
import time

@app.middleware("http")
async def log_requests(request: Request, call_next):
    start_time = time.time()
    
    logger.bind(
        method=request.method,
        path=request.url.path,
        client=request.client.host
    ).info("请求开始")
    
    response = await call_next(request)
    
    process_time = time.time() - start_time
    logger.bind(
        method=request.method,
        path=request.url.path,
        status_code=response.status_code,
        process_time=f"{process_time:.3f}s"
    ).info("请求完成")
    
    return response

四、结构化日志

# 使用bind添加上下文
logger.bind(
    user_id=user.id,
    username=user.username,
    action="create_conversation"
).info("创建对话")

# 使用patch临时添加上下文
with logger.contextualize(request_id=request_id):
    logger.info("处理请求")
    # 所有日志都会包含request_id

下一篇预告: 《生产环境配置:环境变量与安全管理》