022-spdlog

spdlog

以下是從原理到代碼實現的全方位spdlog技術調研結果,結合核心架構、優化策略和完整代碼示例:

一、核心架構設計原理

spdlog三級架構 (圖示說明:spdlog采用三級結構實現日志系統解耦)

  • Registry管理中樞

全局單例管理所有logger對象
提供日志級別全局閾值設置
實現日志對象檢索和生命周期管理

  • Logger處理器
class logger {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輸出終端
    支持6種輸出類型(文件/控制臺/系統日志等),通過組合模式實現多路輸出

二、異步模式工作原理

異步模式流程圖 (異步模式采用生產者-消費者模型實現)

  • 環形隊列結構
template<typename T>
class circular_q {std::mutex queue_mutex_;std::vector<T> q_;size_t max_items_;// 支持三種溢出策略:// 1. 阻塞寫入 2. 丟棄新日志 3. 覆蓋舊日志
}
  • 線程池配置參數
spdlog::init_thread_pool(8192, // 隊列容量(建議設置為2的冪次)2     // 后臺線程數(根據CPU核心數調整)
);

三、關鍵優化參數配置

  • 性能優化矩陣表
參數類型推薦值作用域性能影響
異步隊列大小8192-32768全局+++
刷新間隔std::chrono::seconds(3)單個logger++
文件緩沖區64KB文件sink+
日志等級閾值warn全局/logger+++
  • 代碼配置示例
// 創建異步日志器
auto async_file = spdlog::basic_logger_mt<spdlog::async_factory>("async_log", "logs/async.log", spdlog::file_event_handlers{.before_open = [](const auto& filename) { /* 預創建文件 */ },.after_open = [](auto file) { file->set_buffer_size(65536); }}
);// 設置優化參數
async_file->set_level(spdlog::level::warn);          // 日志級別過濾
async_file->flush_on(spdlog::level::err);            // 錯誤立即刷新
async_file->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] %v"); 
spdlog::flush_every(std::chrono::seconds(3));       // 定時刷新

四、完整實現代碼示例

#include <spdlog/spdlog.h>
#include <spdlog/async.h>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>// 復合型日志器配置
void setup_logger() {// 1. 初始化線程池spdlog::init_thread_pool(32768, 2); // 2. 創建多個sinkauto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("logs/app.log",  1024*1024*5, 3);// 3. 組合sink創建異步loggerstd::vector<spdlog::sink_ptr> sinks{console_sink, file_sink};auto logger = std::make_shared<spdlog::async_logger>("multi_sink", sinks.begin(),  sinks.end(), spdlog::thread_pool(),spdlog::async_overflow_policy::block);// 4. 配置高級參數logger->set_level(spdlog::level::debug);logger->set_error_handler([](const std::string& msg) {std::cerr << "Logger error: " << msg << std::endl;});// 5. 注冊全局日志器spdlog::register_logger(logger);spdlog::set_default_logger(logger);
}// 使用示例
int main() {setup_logger();SPDLOG_DEBUG("Debug message");   // 低于warn級別被過濾SPDLOG_WARN("Important warning");spdlog::drop_all();  // 確保所有日志刷新
}

五、性能對比測試數據

  • 在不同硬件環境下的基準測試結果(單位:百萬條/秒):
模式單線程4線程優化建議
同步文件模式0.80.5避免高頻小文件寫入
異步內存模式3.212.7增大隊列容量
異步SSD模式2.18.9啟用文件預分配

六、最佳實踐建議

  • 高頻日志場景:啟用SPDLOG_NO_ATOMIC_LEVELS編譯選項提升10-15%性能
  • 穩定性要求高的系統:設置overflow_policy::block防止日志丟失
  • 分布式系統:通過udp_sink實現日志集中管理

完整代碼

Github

作者鄭天佐
郵箱zhengtianzuo06@163.com
主頁http://www.zhengtianzuo.com
githubhttps://github.com/zhengtianzuo

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73062.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73062.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73062.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32時鐘樹

時鐘樹 時鐘樹就是STM32中用來產生和配置時鐘&#xff0c;并且把配置好的時鐘發送到各個外設的系統&#xff0c;時鐘是所有外設運行的基礎&#xff0c;所以時鐘也是最先需要配置的東西&#xff0c;在程序中主函數之前還會執行一個SystemClock_Config()函數&#xff0c;這個函數…

【第22節】windows網絡編程模型(WSAAsyncSelect模型)

目錄 引言 一、WSAAsyncSelect模型概述 二、WSAAsyncSelect模型流程 2.1 自定義消息 2.2 創建窗口例程 2.3 初始化套接字 2.4 注冊網絡事件 2.5 綁定和監聽 2.6 消息循環 三、完整示例代碼 引言 在網絡編程的廣袤天地中&#xff0c;高效處理網絡事件是構建穩定應用的…

利用Dify編制用戶問題意圖識別和規范化回復

繼上一篇文章&#xff0c;成功完成Dify本地部署后&#xff0c;主要做了一些workflow和Agent的應用實現&#xff0c;整體感覺dify在工作流可視化編排方面非常好&#xff0c;即使部分功能無法實現&#xff0c;也可以通過代碼執行模塊或者自定義工具來實現&#xff08;后續再具體分…

雙核鎖步技術在汽車芯片軟錯誤防護中的應用詳解

摘要 本文深入探討了雙核鎖步技術在保障汽車芯片安全性中的應用。文章首先分析了國產車規芯片在高安全可靠領域面臨的軟錯誤難點及攻克方向&#xff0c;然后詳細介紹了雙核鎖步技術的基本原理及其在汽車芯片防軟錯誤的重要性。通過對比國內外多家廠商的芯片技術&#xff0c;分析…

Lustre 語言的 Rust 生成相關的工作

目前 Lustre V6 編譯器支持編譯生成的語言為C語言。但也注意到&#xff0c;以 Rust 語言為生成目標語言&#xff0c;也存在若干相關工作。 rustre&#xff08;elegaanz&#xff09; 該項工作為 Lustre v6 語言的解析器&#xff0c;使用 Rust 語言實現。生成 Lustre AST。 項…

Java 之「單調棧」:從入門到實戰

Java 單調棧&#xff1a;從入門到實戰 文章目錄 Java 單調棧&#xff1a;從入門到實戰引言什么是單調棧&#xff1f;單調遞增棧單調遞減棧 單調棧的應用場景Java 實現單調棧代碼示例&#xff1a;下一個更大元素代碼解析 單調棧的優勢實戰應用&#xff1a;股票價格跨度代碼示例代…

【Golang】defer與recover的組合使用

在Go語言中&#xff0c;defer和recover是兩個關鍵特性&#xff0c;通常結合使用以處理資源管理和異常恢復。以下是它們的核心應用場景及使用示例&#xff1a; 1. defer 的應用場景 defer用于延遲執行函數調用&#xff0c;確保在函數退出前執行特定操作。主要用途包括&#xff…

CSS 中flex - grow、flex - shrink和flex - basis屬性的含義及它們在彈性盒布局中的協同作用。

大白話CSS 中flex - grow、flex - shrink和flex - basis屬性的含義及它們在彈性盒布局中的協同作用。 在 CSS 的彈性盒布局&#xff08;Flexbox&#xff09;里&#xff0c;flex-grow、flex-shrink 和 flex-basis 這三個屬性對彈性元素的尺寸和伸縮性起著關鍵作用。下面為你詳細…

OpenGL ES ->乒乓緩沖,計算只用兩個幀緩沖對象(Frame Buffer Object)+疊加多個濾鏡作用后的Bitmap

乒乓緩沖核心思想 不使用乒乓緩沖&#xff0c;如果要每個濾鏡作用下的繪制內容&#xff0c;也就是這個濾鏡作用下的幀緩沖&#xff0c;需要創建一個Frame Buffer Object加上對應的Frame Buffer Object Texture使用乒乓緩沖&#xff0c;只用兩個Frame Buffer Object加上對應的F…

【HarmonyOS NEXT】關鍵資產存儲開發案例

在 iOS 開發中 Keychain 是一個非常安全的存儲系統&#xff0c;用于保存敏感信息&#xff0c;如密碼、證書、密鑰等。與文件系統不同&#xff0c;Keychain 提供了更高的安全性&#xff0c;因為它對數據進行了加密&#xff0c;并且只有經過授權的應用程序才能訪問存儲的數據。那…

ccfcsp1901線性分類器

//線性分類器 #include<iostream> using namespace std; int main(){int n,m;cin>>n>>m;int x[1000],y[1000];char z[1000];for(int i0;i<n;i){cin>>x[i]>>y[i];cin>>z[i];}int a[20],b[20],c[20];for(int i0;i<m;i){cin>>a[i…

Spring Boot 整合 OpenFeign 教程

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 Spring Boot 整合 OpenFeign 教程 一、OpenFeign 簡介 OpenFeign 是 Netflix 開源的聲明式 HTTP 客戶端&#xff0c;通過接口和注解簡化服務間 HTTP 調用。…

APM 仿真遙控指南

地面站開發了一段時間了&#xff0c;由于沒有硬件&#xff0c;所以一直在 APM 模擬器中驗證。我們已經實現了 MAVLink 消息接收和解析&#xff0c;顯示無人機狀態&#xff0c;給無人機發送消息&#xff0c;實現一鍵起飛&#xff0c;飛往指定地點&#xff0c;降落&#xff0c;返…

C語言入門教程100講(4)輸入輸出

文章目錄 1. 什么是輸入輸出&#xff1f;2. 標準輸入輸出函數2.1 printf 函數2.2 scanf 函數 3. 格式化占位符4. 示例代碼代碼解析&#xff1a;輸出結果&#xff1a; 5. 常見問題問題 1&#xff1a;scanf 中的 & 是什么作用&#xff1f;問題 2&#xff1a;printf 和 scanf …

《信息系統安全》(第一次上機實驗報告)

實驗一 &#xff1a;網絡協議分析工具Wireshark 一 實驗目的 學習使用網絡協議分析工具Wireshark的方法&#xff0c;并用它來分析一些協議。 二實驗原理 TCP/IP協議族中網絡層、傳輸層、應用層相關重要協議原理。網絡協議分析工具Wireshark的工作原理和基本使用規則。 三 實…

城市街拍人像自拍電影風格Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色教程 城市街拍人像自拍的電影風格 Lr 調色&#xff0c;是利用 Adobe Lightroom 軟件&#xff0c;對在城市街景中拍攝的人像自拍照片進行后期處理&#xff0c;使其呈現出電影畫面般獨特的視覺質感與藝術氛圍。通過一系列調色操作&#xff0c;改變照片的色彩、明暗、對比等元…

自學Python創建強大AI:從入門到實現DeepSeek級別的AI

人工智能&#xff08;AI&#xff09;是當今科技領域最熱門的方向之一&#xff0c;而Python是AI開發的首選語言。無論是機器學習、深度學習還是自然語言處理&#xff0c;Python都提供了豐富的庫和工具。如果你夢想創建一個像DeepSeek這樣強大的AI系統&#xff0c;本文將為你提供…

Qt/C++項目積累:4.遠程升級工具 - 4.1 項目設想

背景&#xff1a; 桌面程序一般都支持遠程升級&#xff0c;也是比較常用的場景設計。如酷狗音樂的升級&#xff0c;會提供兩個選項&#xff0c;自動幫助安裝或是新版本提醒&#xff0c;由用戶來決定是否升級&#xff0c;都屬于遠程升級的應用及策略。 看看經過這塊的功能了解及…

(一)丶Windows安裝RabbitMQ可能會遇到的問題

一丶可能會忘了配置ERLang的環境變量 二丶執行命令時報錯 第一步 rabbitmq-plugins enable rabbitmq_management 第二部 rabbitmqctl status 三丶修改.erlang.cookie 文件 1.找到C盤目下的.erlang.cookie文件 C:\Users\admin\.erlang.cookie C:\Windows\System32\config\sys…