本文详细介绍了如何绕过 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 日志-这是生产级日志定制的正确路径。