首页
/ Quill日志库中的JSON日志记录实践

Quill日志库中的JSON日志记录实践

2025-07-04 21:26:11作者:冯爽妲Honey

背景介绍

Quill是一个高性能的C++异步日志库,在现代C++应用开发中广受欢迎。随着微服务架构和云原生应用的普及,JSON格式的日志输出变得越来越重要,因为它便于日志收集系统(如ELK Stack)的解析和处理。

问题分析

在Quill日志库中,用户最初遇到了一个关于JSON日志记录的需求挑战。核心问题在于日志记录时如何优雅地生成JSON格式的输出,而不影响应用程序的性能关键路径(hot path)。

传统的日志记录方式通常依赖于格式化字符串,例如:

LOG_CRITICAL(worker_logger, "Some message with {}", "parameters");

但对于结构化日志记录,特别是JSON格式,开发者更希望能够直接传递结构化数据,如:

std::map<std::string, std::string> mymap{{"boo", "berry"}};
LOG_CRITICAL(worker_logger, my_json_formatter(), {"foo", "bar"}, mymap);

解决方案探索

自定义格式化器方案

最初设想的解决方案是创建一个自定义的JSON格式化器,该格式化器可以在后台线程中被调用,从而避免在主线程(性能关键路径)上进行JSON序列化操作。这种方法理论上可以:

  1. 在主线程只收集日志数据和元数据
  2. 将实际的JSON格式化工作推迟到后台线程
  3. 保持高性能的同时实现结构化日志输出

实际实现方案

经过深入研究和实践,开发者发现了一个更简单有效的实现方式:通过为自定义类实现fmt库的格式化器(formatter)来达成目的。

这种方法利用了Quill底层依赖的fmt库的强大格式化能力,允许开发者:

// 自定义类的fmt格式化特化
template <>
struct fmt::formatter<MyCustomClass> {
    template <typename ParseContext>
    constexpr auto parse(ParseContext& ctx) { return ctx.begin(); }

    template <typename FormatContext>
    auto format(const MyCustomClass& obj, FormatContext& ctx) {
        return format_to(ctx.out(), R"({{"field1":"{}","field2":"{}"}})", 
                         obj.field1, obj.field2);
    }
};

然后就可以直接在日志调用中使用:

MyCustomClass obj;
LOG_INFO(logger, "Structured log: {}", obj);

技术要点

  1. 性能考量:JSON序列化通常较为耗时,应避免在关键路径上执行
  2. 结构化日志:使用map或其他容器直接传递结构化数据
  3. fmt库集成:利用fmt的强大格式化能力实现自定义输出
  4. 线程模型:Quill的异步设计确保格式化工作不会阻塞主线程

最佳实践建议

  1. 对于简单的JSON日志,可以直接使用fmt库的格式化能力
  2. 对于复杂的结构化数据,考虑实现自定义类型的formatter特化
  3. 保持日志调用点的简洁,将复杂逻辑隐藏在formatter实现中
  4. 在性能敏感场景,确保验证后台线程的格式化性能

总结

通过合理利用Quill和fmt库的特性,开发者可以轻松实现高性能的JSON日志记录功能,既保持了代码的简洁性,又不牺牲性能。这种模式特别适合需要与现代化日志分析系统集成的应用场景。

登录后查看全文
热门项目推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
261
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
860
511
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
259
300
kernelkernel
deepin linux kernel
C
22
5
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
595
57
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
371
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
332
1.08 K