当前位置: 首页 > news >正文

spdlog日志器(logger)的创建方法大全

根据Spdlog源码分析及技术文档,其日志器(logger)的创建方法可分为以下核心类型:


%%
在这里插入图片描述
%%

一、工厂函数直接创建

通过内置工厂模板函数快速生成预配置的日志器,适用于常见场景:

  1. 控制台日志器
// 多线程彩色控制台输出(_mt表示多线程安全)
auto console = spdlog::stdout_color_mt("console_logger");
// 错误输出专用
auto stderr_logger = spdlog::stderr_color_mt("error_logger");
  • 此类日志器支持ANSI颜色编码,输出级别可通过set_level()动态调整。
  1. 基础文件日志器
// 单文件持续写入(无滚动策略)
auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/app.log");
  • 需注意长时间运行可能导致文件过大。
  1. 滚动文件日志器
// 文件大小超过5MB后滚动(保留3个历史文件)
auto rotating_logger = spdlog::rotating_logger_mt("rot_logger", "logs/rot.log", 5 * 1024 * 1024, 3);
  • 采用先进先出策略管理历史文件。
  1. 每日文件日志器
// 每天0点创建新文件,保留7天日志
auto daily_logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.log", 0, 0, false, 7);    
  • 第五参数truncate控制是否覆盖已有文件。

二、手动组合创建

通过直接构造spdlog::logger对象实现高度定制化:

// 1. 创建Sink集合
std::vector<spdlog::sink_ptr> sinks;
sinks.push_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>()); // 控制台
sinks.push_back(std::make_shared<spdlog::sinks::daily_file_sink_mt>("logs/combo.log", 23, 59)); // 每日文件// 2. 构造日志器对象
auto custom_logger = std::make_shared<spdlog::logger>("custom", sinks.begin(), sinks.end());// 3. 注册全局访问(可选)
spdlog::register_logger(custom_logger);

此方式支持多Sink组合输出,如同时写入控制台、文件、网络等。


三、异步日志器创建

采用生产者-消费者模型提升性能:

// 初始化线程池(队列容量8192,2个工作线程)
spdlog::init_thread_pool(8192, 2);// 创建异步日志器
auto async_logger = spdlog::basic_logger_mt<spdlog::async_factory>("async_logger", "logs/async.log");

特点包括:
• 支持阻塞/丢弃/覆盖三种队列溢出策略
• 通过flush_every(sec)设置定时刷新间隔
• 吞吐量可达同步模式的4倍以上


四、高级配置方法

  1. 全局注册与访问
// 注册日志器
spdlog::register_logger(my_logger);// 全局获取
auto logger = spdlog::get("logger_name");
  • 需注意频繁调用spdlog::get()可能影响性能。
  1. 共享Sink复用
auto shared_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("shared.log");
auto logger1 = std::make_shared<spdlog::logger>("logger1", shared_sink);
auto logger2 = std::make_shared<spdlog::logger>("logger2", shared_sink);
  • 多个日志器共享同一Sink时需确保线程安全。

五、源码设计解析

  1. 工厂模式实现
    • 通过模板工厂类(如synchronous_factory)解耦日志器与Sink的创建过程,支持扩展自定义Sink类型。
  2. 日志器核心结构
class logger {
private:std::string name_;std::vector<sink_ptr> sinks_;level::level_enum level_;// 日志处理逻辑void log(log_msg& msg) {if (should_log(msg.level)) {for (auto& sink : sinks_) sink->log(msg);}}
};
  • 采用组合模式管理Sink,支持多路分发。

最佳实践建议

  1. 高频日志场景启用SPDLOG_NO_ATOMIC_LEVELS编译选项提升性能
  2. 分布式系统建议采用udp_sink实现集中式日志管理
  3. 文件类日志器需设置合理的缓冲区大小(如64KB)减少IO操作

完整代码示例及性能优化参数可参考官方文档。

相关文章:

  • 从0到1:Python机器学习实战全攻略(8/10)
  • 03.Golang 切片(slice)源码分析(二、append实现)
  • 循环语句:for、range -《Go语言实战指南》
  • 【layout组件 与 路由镶嵌】vue3 后台管理系统
  • uniapp(微信小程序)>关于父子组件的样式传递问题(自定义组件样式穿透)
  • 涨薪技术|0到1学会性能测试第58课-垃圾回收器
  • 【Pandas】pandas DataFrame cummax
  • 【LeeCode】1.两数之和
  • 读取.ini后缀类型的马达配置文件并进行赋值
  • 【操作系统】零拷贝技术
  • LearnOpenGL02:绘制三角形和矩形
  • 【办公类-99-06】20250512用Python制作PPT的GIF照片动图(统一图片大小、自定义不同切换秒数,以蝴蝶为例)
  • 家具制造行业的现状 质检LIMS如何赋能家具制造企业质检升级
  • 学习黑客5 分钟深入浅出理解系列之 Windows 资源监视器
  • LeetCode 热题 100_只出现一次的数字(96_136_简单_C++)(哈希表;哈希集合;排序+遍历;位运算)
  • Windows 安装 Milvus
  • 基于ESP32的健康智能机器人
  • 使用conda导致无法找到libpython动态库
  • 高粘度、强腐蚀介质解决方案:V型气动带手动活塞式开关调节球阀的五大核心优势-耀圣控制
  • react项目阅读记录
  • 广东省人大教科文卫委原主任委员梁万里被开除党籍:退休后受贿仍不知止
  • 外媒:初步结果显示,菲律宾前总统杜特尔特当选达沃市市长
  • 人民币对美元即期汇率盘中创半年新高,离岸市场升破7.2
  • 1至4月我国汽车产销量首次双超千万辆
  • 被流量绑架人生,《人生开门红》能戳破网络时代的幻象吗
  • 俄乌释放停火和谈信号,克宫:将组建“相应级别”谈判代表团