spdlog 項目介紹與二次封裝

目錄

介紹

二次封裝


介紹

???????? spdlog 是C++開源的第三方日志庫,整個項目在 spdlog 命名空間中。

????????在 spdlog 命名空間的?level 命名空間里定義了枚舉類型,把日志分為了 5 個等級:trace??debug? ?info? ?warn? err? ?critical

enum level_enum : int {trace = SPDLOG_LEVEL_TRACE,debug = SPDLOG_LEVEL_DEBUG,info = SPDLOG_LEVEL_INFO,warn = SPDLOG_LEVEL_WARN,err = SPDLOG_LEVEL_ERROR,critical = SPDLOG_LEVEL_CRITICAL,off = SPDLOG_LEVEL_OFF,n_levels};

? ? ? ? spdlog::logger 類是基類(是整個項目其他日志類的基類)。spdlog::spdlog::async_logger 類是異步日志類。不過我們用該項目的時候不直接使用類實例化對象,而是用工廠類幫我們實例化對象。

? ? ? ? 那么我們現在只需認識?spdlog::logger 類的幾個接口即可

 //設置日志輸出最低等級,參數為 spdlog::level::level_enumvoid set_level();//以什么等級輸出日志,參數為要輸出的內容(字符串)void trace()void debug()void info()void warn()void error()void critical()

在 spdlog 項目中,占位符用 {}

幾個重要的全局接口

//輸出等級設置接口
void set_level(level::level_enum log_level);
//日志刷新策略-每隔 N 秒刷新一次
void flush_every(std::chrono::seconds interval)
//日志刷新策略-觸發指定等級立即刷新
void flush_on(level::level_enum log_level);

工廠類的接口就不介紹了,可以到項目源碼的下面查看,作者給出了很多詳細示例。工廠類的返回值為?std::shared_ptr<spdlog::logger>?,也就是智能指針指向基類,用智能指針管理日志類資源。

GitHub - gabime/spdlog: Fast C++ logging library.

二次封裝

代碼如下

#include <spdlog/spdlog.h>
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/async.h"
#include "spdlog/sinks/basic_file_sink.h"
#include <chrono>   //C++ 標準庫namespace LOG
{std::shared_ptr<spdlog::logger> log_ptr;bool init_logger_ok = false;//mode 為 true 表示在調試模式下輸出日志,trace 等級以上的日志全部輸出,且輸出到顯示器上,否則就是在發布模式下輸出日志,只會輸出 level 及以上等級的日志//interval 表示多少毫秒刷新一次日志//flie_path 表示發布模式下,異步日志刷新到哪個文件里void init_logger(   bool mode = true, int interval = 1000, spdlog::level::level_enum level = spdlog::level::level_enum::trace, std::string flie_path = "test.log"){//間隔多長時間刷新一次spdlog::flush_every(std::chrono::duration<double, std::ratio<1, 1000>>(interval));//觸發指定等級立即刷新spdlog::flush_on(spdlog::level::level_enum::err);spdlog::flush_on(spdlog::level::level_enum::critical);if(true == mode){//在調試模式下輸出日志log_ptr = spdlog::stderr_color_mt("stdout_logger");log_ptr->set_level(level);  }else{//在運行模式下,采用異步日志的方式log_ptr = spdlog::basic_logger_mt<spdlog::async_factory>("async_logger", flie_path);log_ptr->set_level(level);}//設置輸出格式log_ptr->set_pattern("%H:%M:%S [%n][%-7l]%v");init_logger_ok = true;}#define LOG_DEBUG(format, ...) false == LOG::init_logger_ok ? throw "未初始化日志" : LOG::log_ptr->debug(std::string("[{:>10s}:{:<4d}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)#define LOG_INFO(format, ...) false == LOG::init_logger_ok ? throw "未初始化日志" : LOG::log_ptr->info(std::string("[{:>10s}:{:<4d}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)#define LOG_WARN(format, ...) false == LOG::init_logger_ok ? throw "未初始化日志" : LOG::log_ptr->warn(std::string("[{:>10s}:{:<4d}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)#define LOG_ERROR(format, ...) false == LOG::init_logger_ok ? throw "未初始化日志" : LOG::log_ptr->error(std::string("[{:>10s}:{:<4d}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)
}

? ? ? ? 用 LOG::init_logger 初始化日志類,可以選擇兩種模式:

? ? ? ? 調試模式:同步的方式輸出日志,最低日志等級為?trace 。

? ? ? ? 發布模式:異步方式輸出日志,最低輸出日志等級自己決定。

????????std::chrono::duration<double, std::ratio<1, 1000>> 表示間隔多少個 1 / 1000 秒。

? ? ? ? 常見的輸出格式如下:

%t - 線程 IDThread ID)。
%n - 日志器名稱(Logger name)。
%l - 日志級別名稱(Level name),如 INFO, DEBUG, ERROR 等。
%v - 日志內容(message)。
%Y - 年(Year)。
%m - 月(Month)。
%d - 日(Day)。
%H - 小時(24-hour format)。
%M - 分鐘(Minute)。
%S - 秒(Second)。

在使用時要鏈接兩個庫,makefile 如下示例

main : main.ccg++ -std=c++17 $^ -o $@ -lspdlog -lfmt

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

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

相關文章

shell編程之awk命令詳解

1. awk 教程 1.1 調用 awk awk 是一種強大的文本處理工具&#xff0c;在 Linux 系統中廣泛應用于日志分析、數據處理等場景。調用 awk 主要有以下三種方式&#xff1a; 1.1.1 命令行方式 基本語法為&#xff1a; awk (-F filed-separator) commands input-files其中&#…

服務器需要備案嗎?在哪些地區需要備案?

&#x1f3af; 服務器是否需要備案&#xff1f; 是否需要備案&#xff0c;關鍵看以下兩個因素&#xff1a; 服務器所在地&#xff08;機房位置&#xff09; 網站面向的訪問群體&#xff08;境內或境外&#xff09; &#x1f3f7; 中國大陸&#xff08;境內&#xff09;服務器…

HarmonyOS學習3---ArkUI

1、組件 1.1、基礎組件 1.2、布局容器 1.3、頁面導航 1.4、其他組件 2、ArkTs/C混合開發&#xff0c;高性能編碼 3、布局能力&交互歸一 4、實時開發預覽

Java學習第十五部分——MyBatis

目錄 一.概述 二.特點 三.組件 四.Mapper 五.配置文件 六.使用步驟 七.高級功能 八.優點缺點 九.項目實戰 1.打開idea創建一個Java項目&#xff0c;構建系統選“Maven”? 2.創建完成后若依賴報錯&#xff0c;可通過下載或重新加載來解決? 3.配置pom.xml文件&…

小企業如何搭建本地私有云服務器,并設置內部網絡地址提供互聯網訪問

在數字化時代&#xff0c;很多普通公司小企業規模的&#xff0c;利用本地小型服務器或計算機搭建私有云服務器&#xff0c;不僅可以提升數據管理效率&#xff0c;還能保障業務數據的安全性和靈活性。以下是為小企業量身定制的私有云服務器搭建指南&#xff0c;及最后附無公網IP…

MySQL 八股文【持續更新ing】

MySQL 八股文【持續更新ing】 文章目錄 MySQL 八股文【持續更新ing】前言一、MySQL的存儲引擎有哪些&#xff1f;他們之間有什么區別&#xff1f;二、MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么區別&#xff1f;1.InnoDB 中的聚簇索引2.InnoDB 中的非聚簇索引 三、MySQL…

每日算法刷題Day42 7.5:leetcode前綴和3道題,用時2h

7. 3026.最大好子數組和(中等,學習) 3026. 最大好子數組和 - 力扣&#xff08;LeetCode&#xff09; 思想 1.給你一個長度為 n 的數組 nums 和一個 正 整數 k 。 如果 nums 的一個子數組中&#xff0c;第一個元素和最后一個元素 差的絕對值恰好 為 k &#xff0c;我們稱這個…

Linux操作系統之文件(四):文件系統(上)

前言&#xff1a; 我們前幾篇文章講了緩沖區與重定向的有關概念&#xff0c;這些設計是linux系統的核心機制&#xff0c;對系統性能、資源管理和用戶操作靈活性有重要意義。 不涉及一些硬件就不可能讓大家清楚地去理解文件系統&#xff0c;所以這篇文章&#xff0c;我將會從計…

java中,stream的filter和list的removeIf篩選速度比較

在 Java 里&#xff0c;Stream 的filter和 List 的removeIf篩選效率要依據具體情形來判斷。 1. 操作本質有別 Stream 的 filter&#xff1a; 它是一種中間操作&#xff0c;不會立刻執行&#xff0c;而是把篩選條件記錄下來。只有遇到終端操作時&#xff0c;才會開始處理元素。…

Python(28)Python循環語句指南:從語法糖到CPython字節碼的底層探秘

目錄 引言一、推導式家族全解析1.1 基礎語法對比1.2 性能對比測試 二、CPython實現揭秘2.1 字節碼層面的秘密2.2 臨時變量機制 三、高級特性實現3.1 嵌套推導式優化3.2 條件表達式處理 四、性能優化指南4.1 內存使用對比4.2 執行時間優化技巧 五、最佳實踐建議六、總結&#x1…

深度分析:Microsoft .NET Framework System.Random 的 C++ 復刻實現

深度分析&#xff1a;Microsoft .NET Framework Random 的 C 復刻實現 核心原理與算法結構 本實現基于 Knuth 減隨機數生成器&#xff08;Subtractive Random Number Generator&#xff09;&#xff0c;是 .NET Framework 中 System.Random 的精確復刻。其核心特點包括&#x…

[論文閱讀] 人工智能 | 在非CUDA硬件上運行幾何學習:基于Intel Gaudi-v2 HPU的PyTorch框架移植實踐

在非CUDA硬件上運行幾何學習&#xff1a;基于Intel Gaudi-v2 HPU的PyTorch框架移植實踐 論文標題&#xff1a;PyTorch-based Geometric Learning with Non-CUDA Processing Units: Experiences from Intel Gaudi-v2 HPUs arXiv:2507.01031 (cross-list from cs.LG) PyTorch-ba…

Python-多線程-threading

1 需求 2 接口 3 示例 4 參考資料 Python treading 模塊 | 菜鳥教程

2025年- H91-Lc199-- 62.不同路徑(多維動態規劃)--Java版

1.題目描述 2.思路 dp含義&#xff1a;代表到當前位置的路徑數 遞推公式&#xff1a;dp[i][j]dp[i-1][j]dp[i][j-1] dp數組初始化&#xff0c;我們要確保第一行和第一列是有值的. dp數組的遍歷順序&#xff1a;我們需要從左往右遍歷&#xff0c;從上往下遍歷。并且把第一行和第…

char 不是 Java 中的 2 字節(16 位)嗎? 為什么用 UTF-8 編碼寫入時,一個中文要占 3 個字節?

char 不是 Java 中的 2 字節&#xff08;16 位&#xff09;嗎&#xff1f; 為什么用 UTF-8 編碼寫入時&#xff0c;一個中文要占 3 個字節&#xff1f; ? 一、Java 中的 char 是什么&#xff1f; Java 的 char 是一個 固定大小的 2 字節&#xff08;16 位&#xff09;類型&am…

【Elasticsearch】檢索排序 分頁

檢索排序 & 分頁 1.測試數據準備2.排序功能2.1 簡單字段排序2.2 多字段排序2.3 日期排序 3.分頁功能3.1 基礎分頁3.2 深度分頁&#xff08;不推薦大數據量使用&#xff09;3.3 使用 search_after 進行高效分頁 4.綜合示例&#xff1a;高亮排序分頁5.實踐建議 1.測試數據準備…

Delta、Jackknife、Bootstrap

用班級平均身高的案例&#xff0c;展示 ?Delta、Jackknife、Bootstrap? 的完整計算過程。 ?0. 數據準備? ?原始數據&#xff08;4個學生的身高&#xff09;??&#xff1a; 真實均值&#xff08;目標統計量&#xff09;??&#xff1a; ?1. Delta 方法&#xff08;公式…

企業智腦技術架構設計:緊貼企業場景規劃面向未來的發展趨勢與實現路徑

摘要 本文深入探討了企業智腦技術架構的設計理念與發展趨勢&#xff0c;分析了當前企業智能化轉型的技術需求與挑戰&#xff0c;提出了一個面向未來的企業智腦技術架構設計方案。文章從底層技術支撐、核心能力構建、應用場景適配、安全合規保障以及未來發展路徑五個維度展開論…

新手向:Python方向講解

從NASA火星任務到TikTok推薦算法&#xff0c;從自動化腳本到量子計算&#xff0c;Python用import antigravity重新定義了編程邊界 一、設計哲學&#xff1a;優雅明確的編程禪學 Python之禪&#xff08;import this&#xff09;&#xff1a; 優美勝于丑陋&#xff08;Beautifu…

Chrome谷歌瀏覽器插件ModHeader,修改請求頭,開發神器

文章目錄一、介紹與下載二、使用一、介紹與下載 ModHeader顧名思義就是讓我們可以自定義HTTP請求頭或者是重寫響應頭&#xff0c;包括新增請求頭/響應頭或者覆蓋Chrome瀏覽器設置的請求頭的默認值&#xff0c;同時還可以根據URL Pattern來只對特定網站生效。 有條件的同學可以…