当前位置: 首页 > 图灵资讯 > 行业资讯> 如何在 Loguru 中自定义日志结构并输出精简 JSON 格式

如何在 Loguru 中自定义日志结构并输出精简 JSON 格式

来源:图灵python
时间: 2026-07-14 16:54:12

本文详细介绍了如何绕过 Loguru 默认的冗余 JSON 通过自定义,序列化逻辑 serialize 处理器与 format 字符串,实现完全可控的轻量级 JSON 日志输出(如只保留) time 和 error 适配字段) FastAPI 等生产环境。

本文详细介绍了如何绕过 loguru 默认的冗余 json 通过自定义,序列化逻辑 `serialize` 处理器与 `format` 字符串,实现完全可控的轻量级 json 日志输出(如果只保留) `time` 和 `error` 适配字段) fastapi 等生产环境。

Loguru 默认的 JSON 序列化(如 _serialize_record)大量字段将被嵌套(process、thread、file、extra 等),但在实际业务中往往需要极简主义的结构,比如只输出 {"time": "5:30pm", "error": "Type error"}。关键是内部私有方法不能修改,而应该通过 add() 的 serialize + format 实现完全定制的组合。

✅ 正确的做法:使用 serialize=True + 自定义 format + 手动序列化

Loguru 提供了 serialize=True 参数,它会 record 由你控制 format 字符串处理;此时 format 它不再是一个纯字符串模板,而是一个可执行的函数(返回字符串),我们可以在其中构建任何功能。 JSON 结构:

Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

下载

import json
from datetime import datetime
from loguru import logger

def custom_json_format(record):
    # 例如,提取和格式化时间(例如 "5:30pm")
    time_obj = record["time"]
    formatted_time = time_obj.strftime("%I:%M%p").lower()  # → "5:30pm"

    # 提取错误信息(只有当有异常时)
    error_msg = ""
    if record["exception"]:
        exc = record["exception"]
        error_msg = f"{exc.type.__name__}: {exc.value}"

    # 构建最小化 JSON 对象
    data = {
        "time": formatted_time,
        "error": error_msg or record["message"],
    }
    return json.dumps(data, ensure_ascii=False) + "\n"

# 删除默认处理器,添加自定义 JSON 输出
logger.remove()
logger.add(
    "app.log",
    format=custom_json_format,  # ← 关键:传入函数而不是字符串
    serialize=True,             # ← 启用 record 传递模式
    level="INFO",
    rotation="10 MB"
)

# 测试
logger.info("正常日志")
logger.error("类型错误发生")  # 无异常堆栈时
try:
    1 / 0
except Exception:
    logger.exception("捕获到异常")  # 此时 error 字段包含异常类型+消息类型+
⚠️ 注意事项和最佳实践
  • serialize=True 是开关:它让 Loguru 将 record 作为参数传递 format 函数,否则 format 仅支持 {time} {message} 等待占位符,无法访问原始异常对象。
  • 避免重写 _serialize_record:该方法为私有静态方法,非公开 API,强行 monkey patch 版本升级后容易导致崩溃。
  • FastAPI 集成建议:应用启动时的配置 logger(如 main.py 中 configure_logger(),并通过 logger.bind(request_id=...).info(...) 添加上下文字段,并在 custom_json_format 中从 record["extra"] 提取。
  • 性能提示:如果是高频日志,可以预编译 json.dumps 或使用 orjson 替换标准库以提高序列化速度。
✅ 总结

Loguru “解耦格式化和序列化”的灵活性在于:format 控制内容结构,serialize=True 提供数据源,json.dumps 执行最终输出。精确输出符合要求,无需侵入源代码。 SRE 规范或 ELK 入口要求扁平化 JSON 日志-这是生产级日志定制的正确路径。