spdlog框架的安裝與使用

spdlog框架的安裝與使用

  • spdlog的安裝
  • spdlog的使用
  • spdlog二次封裝
  • 總結:

spdlog的安裝

sudo apt-get install libspdlog-dev

spdlog的使用

同步日志器sync.cc
(輸出到顯示器/輸出到指定文件)

#include<spdlog/spdlog.h>
#include<spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>
#include<iostream>int main()
{//設置全局的刷新策略,每秒刷新一次spdlog::flush_every(std::chrono::seconds(1));//遇到debug以上級別的日志立刻刷新spdlog::flush_on(spdlog::level::level_enum::debug);//設置全局的日志輸出等級spdlog::set_level(spdlog::level::level_enum::debug);//創建同步日志器(模板默認是同步工廠,不需要寫,標準輸出,輸出到顯示器上)//auto logger=spdlog::stdout_color_mt("defaut-logger");//創建同步日志器(文件輸出,輸出到文件上)auto logger=spdlog::basic_logger_mt("file-logger","sync_file.log");//設置日志器的刷新策略,以及輸出等級,但是已經有了全局的就可以不用局部的// logger->flush_on(spdlog::level::level_enum::debug);// logger->set_level(spdlog::level::level_enum::debug);//設置日志的輸出格式、logger->set_pattern("[%H:%M:%S][%t][%n][%-8l] %v");//進行簡單的日志輸出logger->trace("你好!{}","陶恩威");logger->debug("你好!{}","陶恩威");logger->info("你好!{}","陶恩威");logger->warn("你好!{}","陶恩威");logger->error("你好!{}","陶恩威");logger->critical("你好!{}","陶恩威");std::cout<<"日志輸出完畢\n";return 0;
}

makefile:

sync:sync.ccg++ -std=c++17 $^ -o $@ -lspdlog -lpthread

異步日志器:async.cc
(輸出到顯示器/輸出到指定文件)

#include<spdlog/spdlog.h>
#include<spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>
#include<spdlog/async.h>
#include<iostream>
//異步日志器跟同步日志器的使用沒有區別,只不過在創建時,需要使用異步工廠日志器模板
int main()
{//設置全局的刷新策略,每秒刷新一次spdlog::flush_every(std::chrono::seconds(1));//遇到debug以上級別的日志立刻刷新spdlog::flush_on(spdlog::level::level_enum::debug);//設置全局的日志輸出等級spdlog::set_level(spdlog::level::level_enum::debug);//創建異步日志器(模板默認是同步工廠,創建異步就需要指定異步工廠,標準輸出,輸出到顯示器上),會將后面的先輸出//而原本的日志輸出后輸出,因為日志先放入了內存中,由線程池輸出//auto logger=spdlog::stdout_color_mt<spdlog::async_factory>("defaut-logger");//異步日志器,文件輸出auto logger=spdlog::basic_logger_mt<spdlog::async_factory>("file-logger","async_file.log");//設置日志的輸出格式、logger->set_pattern("[%H:%M:%S][%t][%n][%-8l] %v");//進行簡單的日志輸出logger->trace("你好!{}","陶恩威");logger->debug("你好!{}","陶恩威");logger->info("你好!{}","陶恩威");logger->warn("你好!{}","陶恩威");logger->error("你好!{}","陶恩威");logger->critical("你好!{}","陶恩威");std::cout<<"日志輸出完畢\n";return 0;
}

makefile:

async:async.ccg++ -std=c++17 $^ -o $@ -lspdlog -lpthread

spdlog二次封裝

spdlog日志輸出沒有文件名和行號,而一般項目中都要有對應的文件名以及行號,所以原本的spdlog就不好用,所以要封裝一下,讓其能夠打印行號與文件名。

要對日志的初始化接口進行封裝
要對日志的輸出接口進行封裝

logger.hpp

//對日志器進行二次封裝
//1.因為原來的日志格式中沒有文件名和行號,所以要進行封裝
//2.為了便于操作,通過命令行參數來決定創建日志器輸出在哪里:
/*如果是debug模式則輸出到標準輸出中.如果是發布模式則輸出到文件中*/#include<spdlog/spdlog.h>
#include<spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>
#include<spdlog/async.h>
//初始化日志器,有三個參數
//1.mode 表示運行的模式,true代表是發布模式,false代表是dubug模式
//2.file 表示如果是發布模式,日志輸出的文件名叫什么,在debug模式下為空
//3.level 發布模式下,輸出的日志等級是什么,在debug模式下為0.
std::shared_ptr<spdlog::logger> default_logger;
void init_logger(bool mode,const std::string&file,uint32_t level)
{if(mode==false){//調試debug模式下,則創建標準輸出日志器,日志器的等級最低為0,刷新策略也是最低default_logger=spdlog::stdout_color_mt("defaut-logger");default_logger->set_level(spdlog::level::level_enum::trace);default_logger->flush_on(spdlog::level::level_enum::trace);}else{//發布模式下,則創建文件輸出日志器,日志器的等級為level,刷新策略也是leveldefault_logger=spdlog::basic_logger_mt("file-logger",file);default_logger->set_level((spdlog::level::level_enum)level);default_logger->flush_on((spdlog::level::level_enum)level);}//創建完日志器之后,就要設置日志器的輸出格式default_logger->set_pattern("[%H:%M:%S][%t][%n][%-8l]%v");
}//日志器初始化完后,就要對日志器的輸出進行封裝,因為日志器的輸出格式中沒有文件名和行號,利用宏定義來修改
#define TRACE_LOG(format,...) default_logger->trace(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define DEBUG_LOG(format,...) default_logger->debug(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define INFO_LOG(format,...) default_logger->info(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define ERROR_LOG(format,...) default_logger->error(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define FATAL_LOG(format,...) default_logger->critical(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);

使用樣例:
mian.cc


#include "logger.hpp"
#include <gflags/gflags.h>
#include<iostream>
//想通過命令行參數調整變量的內容,所以通過gflags框架捕捉命令行參數數據放入到自己定義的全局變量中
DEFINE_bool(run_mode,false,"表示程序的運行模式,默認是false調試默認,true表示發布模式");
DEFINE_string(file,"","表示發布模式下要輸出的文件名稱,默認調試模式下為空");
DEFINE_int32(level,0,"表示發布模式下日志器輸出的等級,默認調試模式下為0");int main(int argc,char*argv[])
{//首先初始化gflags框架,告訴它要捕捉命令行中的參數數據google::ParseCommandLineFlags(&argc, &argv, true);//初始化spdlog日志器;init_logger(FLAGS_run_mode,FLAGS_file,FLAGS_level); //日志輸出TRACE_LOG("你好呀 {}","陶恩威");DEBUG_LOG("你好呀 {}","陶恩威");INFO_LOG("你好呀 {}","陶恩威");ERROR_LOG("你好呀 {}","陶恩威");FATAL_LOG("你好呀 {}","陶恩威");return 0;
}

makefile:

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

總結:

spdlog日志庫封裝與使用
本文介紹了spdlog日志庫的安裝、基本使用和二次封裝方法。主要內容包括:
spdlog安裝:通過apt-get install libspdlog-dev命令安裝
基本使用:
同步日志器:支持輸出到顯示器或文件
異步日志器:使用線程池提高性能

二次封裝:
封裝了日志初始化接口,支持通過命令行參數控制日志輸出模式(debug/發布)
封裝了日志輸出宏,添加了文件名和行號信息
使用gflags框架處理命令行參數

示例代碼展示了如何初始化日志器和輸出不同級別的日志信息

封裝后的日志庫更方便在項目中使用,能夠自動記錄文件名和行號,并通過命令行參數靈活控制日志行為。

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

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

相關文章

使用websockets中的一些問題和解決方法

&#xff08;1&#xff09;TypeError: echo() missing 1 required positional argument: path報錯自己寫的代碼如下&#xff1a;async def echo(websocket, path):...async def main():server await websockets.serve(echo, "0.0.0.0", 666)await server.wait_close…

機器人相關基礎知識

機器人簡介下面給出一份機器人方向“從入門到進階”的極簡知識地圖&#xff0c;按「數學 → 硬件 → 軟件 → 算法 → 應用」五層展開&#xff0c;配合常用開源資源。你可以把它當作“字典”隨時查閱。&#x1f539; 1. 數學層&#xff08;所有算法的地基&#xff09;概念一句話…

Windows Server 打開vGPU RDP HEVC編碼

查看已安裝的驅動[rootlocalhost:~] esxcli software vib list Name Version Vendor Acceptance Level Install Date Platforms ----------------------------- ------------------------------------ ------ -…

OpenAL技術詳解:跨平臺3D音頻API的設計與實踐

引言&#xff1a;OpenAL的定位與價值 OpenAL&#xff08;Open Audio Library&#xff09; 是一套跨平臺的3D音頻應用程序接口&#xff08;API&#xff09;&#xff0c;專為高效渲染多通道三維定位音頻而設計。其API風格與編程范式刻意模仿OpenGL&#xff0c;旨在為游戲開發、虛…

重溫 K8s 基礎概念知識系列五(存儲、配置、安全和策略)

文章目錄一、存儲&#xff08;Storage&#xff09;1.1、Volume1.2、PersistentVolume (PV)1.3、PersistentVolumeClaim (PVC)1.4、StorageClass1.5、PVC 和 PV 的綁定過程&#xff1f;二、配置管理&#xff08;Configuration&#xff09;2.1、ConfigMap2.2、Secret2.3、存活、就…

通過PhotoShop將多張圖片整合為gif動畫

一、準備圖片集合二、導入PS導入PS后點擊確定&#xff1a;導入成功&#xff1a;三、添加時間軸勾選創建幀動畫&#xff1a;此時時間軸進化為幀動畫軸&#xff1a;四、圖片集部署在幀動畫軸點擊幀動畫軸右上角的三道橫杠&#xff0c;從圖層建立幀&#xff1a;此時圖片集已經部署…

Easy Rules 規則引擎詳解

Easy Rules 規則引擎詳解 Easy Rules 是一個輕量級的 Java 規則引擎&#xff0c;它提供了一種簡單而強大的方式來定義和執行業務規則。以下是 Easy Rules 的詳細介紹&#xff1a; 1. 核心概念 1.1 規則 (Rule) 條件 (Condition): 當條件為 true 時執行動作動作 (Action): 條件滿…

優雅設計:打造AI時代的高效后端API接口——領碼課堂深度解析

&#x1f4cc; 摘要 后端API接口已經成為軟件架構的神經系統。微服務演化、AI滲透、自動化治理……這些趨勢迫使我們重新定義接口設計的標準。本文從統一規范、參數校驗、異常處理、性能優化四大維度出發&#xff0c;結合領碼Spark的接口治理平臺與AI賦能實踐&#xff0c;構建一…

【VUE】用EmailJS自動發送郵件到網易郵箱

1.注冊 EmailJS 賬號??&#xff1a;訪問 EmailJS 官網并注冊2.添加電子郵件服務??&#xff1a;在 Dashboard 中點擊 "Add New Service"選擇 SMTP server填寫 SMTP 服務器信息SMTP Host: smtphz.qiye.163.com (網易企業郵箱)SMTP Port: 994 (SSL)User: 你的郵箱Ap…

Ubuntu下載、安裝、編譯指定版本python

下載 Index of /ftp/python/ https://www.python.org/downloads/ 刪除舊的python sudo apt autoremove python sudo apt autoremove python3 安裝依賴 sudo apt-get install -y zlib1g-dev libbz2-dev libssl-dev libncurses5-dev \ libsqlite3-dev libreadline-dev tk-d…

如何新建一個自己的虛擬環境

在今天我換了個電腦跑模型的時候&#xff0c;出現了一個問題&#xff1a;C:\ProgramData\Anaconda3\python.exe H:/ywp/project/model/msi_caijian.py Traceback (most recent call last):File "H:/ywp/project/model/msi_caijian.py", line 2, in <module>imp…

(第十八期)圖像標簽的三個常用屬性:width、height、border

&#xff08;第十八期&#xff09;圖像標簽的三個常用屬性&#xff1a;width、height、border 在網頁開發中&#xff0c;控制圖片尺寸與樣式是基礎又高頻的操作。本文圍繞 img 圖像標簽的三個屬性展開&#xff1a;width&#xff08;寬度&#xff09;、height&#xff08;高度&a…

Windows桌面自動化的革命性突破:深度解析Windows-MCP.Net Desktop模塊的技術奧秘

"在數字化浪潮中&#xff0c;桌面自動化不再是程序員的專利&#xff0c;而是每個人都能掌握的超能力。" —— 當我第一次接觸到Windows-MCP.Net的Desktop模塊時&#xff0c;這樣的感慨油然而生。 &#x1f3af; 引言&#xff1a;為什么桌面自動化如此重要&#xff1f…

免費又強大的 PDF 編輯器 ——PDF XChange Editor

在日常的學習和工作中&#xff0c;我們經常會與 PDF 文檔打交道&#xff0c;然而&#xff0c;PDF 文檔的編輯卻常常讓人抓狂。比如拿到一份 PDF 合同或報告&#xff0c;發現里面有錯別字或者需要更新數據&#xff1b;又或者遇到需要填寫的 PDF 表單&#xff0c;只能打印出來手寫…

Unity引擎播放HLS自適應碼率流媒體視頻

大家好&#xff0c;我是阿趙。今天來學習一下Unity引擎怎樣播放自適應碼率視頻的方法。 一、 HLS是什么HLS是什么&#xff0c;各位可以自己百度一下。簡單的概括&#xff0c;HLS是一種自適應碼率流媒體傳輸協議&#xff0c;實現的是分片下載和動態碼率切換。它的原理是把一段視…

Flink 源碼系列 - 前言

Flink 源碼系列 - 前言 &#x1f680; 為什么要學習 Flink 源碼&#xff1f; Apache Flink 作為當前最流行的流式計算框架之一&#xff0c;其源碼體系極其龐大。根據統計&#xff0c;Flink 項目包含&#xff1a; Java 文件總行數&#xff1a;232萬行有效代碼行數&#xff1a…

Rust:實現僅通過索引(序數)導出 DLL 函數的功能

在 Rust 中&#xff0c;可以通過手動控制導出來實現僅通過索引&#xff08;序數&#xff09;導出 DLL 函數的功能。以下是具體方法和完整步驟&#xff1a;解決方案 通過結合 .def 文件&#xff08;模塊定義文件&#xff09;和 MSVC 鏈接器參數來實現函數名隱藏&#xff0c;只暴…

部分網站記錄

Gradle多渠道打包[umeng] https://www.jianshu.com/p/8b8fdd37bf26 介紹在app的build.gradle設置produceFlavors&#xff0c;一鍵打包所有環境的命令 Android 知識圖譜 https://upload-images.jianshu.io/upload_images/19956127-1b214e26967dacc6.jpg 百度的語音識別 https:…

【速通】深度學習模型調試系統化方法論:從問題定位到性能優化

深度學習模型調試的系統化方法論&#xff1a;從問題定位到性能優化 文章目錄深度學習模型調試的系統化方法論&#xff1a;從問題定位到性能優化摘要1. 引言2. 模型調試的層次化框架2.1 三層調試架構2.2 調試優先級原則3. 系統化調試流程3.1 快速診斷清單3.2 最小可復現案例 (MR…

Nacos-6--Naco的QUIC協議實現高可用的工作原理

QUIC&#xff08;Quick UDP Internet Connections&#xff09;是一種基于UDP的傳輸層協議&#xff0c;旨在減少網絡延遲、提升安全性并優化多路復用能力。它由Google開發&#xff0c;后被IETF標準化為HTTP/3的底層協議。 1、QUIC是什么&#xff1f; QUIC&#xff08;Quick UDP …