国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C++ 日志工具推薦之 Spdlog

開發 開發工具
spdlog日志是純頭文件,使用起來比較方便。使用時只需要簡單的初始化即可,這里對其初始化做了一個簡單的封裝,這樣使用起來更加方便。

 [[438871]]

 本文轉載自微信公眾號「嵌入式技術筆記」,作者fensnote。轉載本文請聯系嵌入式技術筆記公眾號。

c++日志工具spdlog

spdlog日志是純頭文件,使用起來比較方便。使用時只需要簡單的初始化即可,這里對其初始化做了一個簡單的封裝,這樣使用起來更加方便。

輸出到console與輸出到文件的級別可以分開設置,并支持動態設置。

封裝類代碼

頭文件

  1. #ifndef _CSPDLOG_H_ 
  2. #define _CSPDLOG_H_ 
  3.  
  4.  
  5. #include "spdlog/spdlog.h" 
  6. #include "spdlog/fmt/bin_to_hex.h" 
  7. #include <memory> 
  8. #include <string> 
  9.  
  10. class CSpdlog 
  11. protected: 
  12.  
  13.     CSpdlog(); 
  14.     ~CSpdlog(); 
  15.     static CSpdlog *m_instance; 
  16.  
  17.  
  18. public
  19.  
  20.     static CSpdlog *GetInstance(); 
  21.     void Init(const std::string & name,const std::string &logPath, std::size_t max_size=1048576, std::size_t max_file = 2); 
  22.     void SetConsoleLogLevel(spdlog::level::level_enum log_level); 
  23.     void SetFileLogLevel(spdlog::level::level_enum log_level); 
  24.  
  25. private: 
  26.     std::vector<spdlog::sink_ptr> m_sinks; 
  27.     std::shared_ptr<spdlog::logger> m_logger; 
  28. }; 
  29.  
  30.  
  31. #endif 

源文件

  1. #include "cspdlog.h" 
  2.  
  3. #include <cstdio> 
  4. #include <iostream> 
  5. #include "spdlog/sinks/stdout_color_sinks.h" // or "../stdout_sinks.h" if no color needed 
  6. #include "spdlog/sinks/basic_file_sink.h" 
  7. #include "spdlog/sinks/rotating_file_sink.h" 
  8.  
  9.  
  10.  
  11.  
  12. CSpdlog::CSpdlog() 
  13.  
  14.  
  15. CSpdlog::~CSpdlog() 
  16.  
  17.  
  18. void CSpdlog::Init(const std::string & name, const std::string &log_path, std::size_t max_size, std::size_t max_file ) 
  19.     try  
  20.     {        
  21.         auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>(); 
  22.         console_sink->set_level(spdlog::level::debug); 
  23.         console_sink->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%n] [tid: %t] [%l] %v%$"); 
  24.  
  25.         std::string logFile = log_path + "/" + name + ".txt"
  26.  
  27.         //auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/multisink.txt"false); 
  28.         auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(logFile, max_size, max_file); 
  29.         file_sink->set_pattern("[%Y-%m-%d %H:%M:%S:%e] [%n] [tid: %t] [%l] %v"); 
  30.         file_sink->set_level(spdlog::level::warn); 
  31.  
  32.         m_sinks.push_back(console_sink); 
  33.         m_sinks.push_back(file_sink); 
  34.  
  35.         //spdlog::logger *logger = new spdlog::logger("multi_sink", {console_sink, file_sink}); 
  36.         m_logger = std::make_shared<spdlog::logger>(namebegin( m_sinks ), end( m_sinks )); 
  37.  
  38.         //spdlog::set_error_handler([](const std::string& msg){printf("*****Custom log error handler, %s*****%\n", msg.c_str());}); 
  39.  
  40.         //注冊到spdlog里 
  41.         spdlog::register_logger(m_logger); 
  42.         //m_logger->info("log init done."); 
  43.         m_logger->flush_on(spdlog::level::level_enum::warn);     
  44.  
  45.     } 
  46.     catch (const spdlog::spdlog_ex &ex) 
  47.     { 
  48.         std::cout<<"Log initialization faild"<<ex.what()<<std::endl; 
  49.     } 
  50.  
  51. void CSpdlog::SetConsoleLogLevel(spdlog::level::level_enum log_level) 
  52.     m_logger->set_level(log_level); 
  53.  
  54. void CSpdlog::SetFileLogLevel(spdlog::level::level_enum log_level) 
  55.     m_sinks[1]->set_level(log_level); 
  56.  
  57. CSpdlog* CSpdlog::m_instance = NULL
  58.  
  59. CSpdlog* CSpdlog::GetInstance() 
  60.     if ( m_instance == NULL ) 
  61.     { 
  62.         m_instance = new CSpdlog; 
  63.     } 
  64.  
  65.     return m_instance; 

測試主程序

  1. #include <stdio.h> 
  2. #include <unistd.h> 
  3. #include <iostream> 
  4. #include <cspdlog.h> 
  5.  
  6. using namespace std; 
  7.  
  8.  
  9.  
  10. int main() 
  11.     CSpdlog::GetInstance()->Init("test","./log"); //初始化日志 
  12.     CSpdlog::GetInstance()->SetConsoleLogLevel(spdlog::level::debug); //設置終端界面輸出級別 
  13.     CSpdlog::GetInstance()->SetFileLogLevel(spdlog::level::warn);     //設置log文件輸出級別 
  14.  
  15.     auto logger = spdlog::get("test");   //獲取日志句柄 
  16.  
  17.     logger->warn("test start."); 
  18.  
  19.     int counter = 0;     
  20.     while(1) 
  21.     { 
  22.         logger->debug("debug msg, counter: {}",counter); 
  23.         logger->info("info msg, counter: {}",counter); 
  24.         logger->warn("warn msg, counter: {}",counter); 
  25.         logger->error("error msg, counter: {}",counter); 
  26.         logger->critical("critical msg, counter: {}",counter); 
  27.         logger->trace("trace msg, counter: {}",counter); 
  28.         usleep(500000); 
  29.     } 
  30.  
  31.     return 0; 

編譯運行

我的通用Makefile

  1. #通用makefile 
  2. #文件目錄 
  3. DEBUG_DIR=. 
  4. SRC_DIR=. 
  5. INC_DIR=. ./spdlog 
  6.  
  7. SRC=$(wildcard $(SRC_DIR)/*.cpp )  #源文件 
  8. OBJS=$(patsubst $(SRC_DIR)/%.cpp,$(DEBUG_DIR)/%.o,$(SRC)) 
  9.  
  10. #目標文件名 
  11. TARGET=test 
  12. INSTALL_PATH ?= . 
  13.  
  14. #修改編譯器 
  15. ARCH ?=  
  16. CC=$(ARCH)gcc 
  17. CPP=$(ARCH)g++ 
  18. AR=$(ARCH)ar 
  19. STRIP=$(ARCH)strip 
  20.  
  21.  
  22. CFLAGS += -Wall -std=c++11 
  23. LDFLAGS += -lpthread 
  24.  
  25. CFLAGS  += $(foreach dir,$(INC_DIR),-I$(dir)) 
  26.  
  27. all:$(TARGET) 
  28. $(TARGET): $(OBJS) 
  29.     $(CPP) $(OBJS) -o $@ $(CFLAGS) $(LDFLAGS) 
  30.     $(STRIP) $(TARGET) 
  31. #cp $(TARGET) $(INSTALL_PATH) 
  32.  
  33.  
  34. $(DEBUG_DIR)/%.o: $(SRC_DIR)/%.cpp 
  35.     $(CPP) $(CFLAGS) -c $< -o $@  
  36.  
  37. #@echo $(SRC) 
  38. #@echo $(OBJS) 
  39.  
  40.  
  41. clean: 
  42.     -rm $(OBJS) $(LIB_TARGET) 

編譯

  1. make  
  2. g++ -Wall -std=c++11 -I. -I./spdlog -c cspdlog.cpp -o cspdlog.o  
  3. g++ -Wall -std=c++11 -I. -I./spdlog -c main.cpp -o main.o  
  4. g++ ./cspdlog.o ./main.o -o test -Wall -std=c++11 -I. -I./spdlog  
  5. strip test 

運行

console輸出:

日志輸出

文件輸出:

  1. $cat log/test.txt  
  2. [2021-08-17 15:30:59:526] [test] [tid: 20418] [warning] test start. 
  3. [2021-08-17 15:30:59:527] [test] [tid: 20418] [warning] warn msg, counter: 0 
  4. [2021-08-17 15:30:59:528] [test] [tid: 20418] [error] error msg, counter: 0 
  5. [2021-08-17 15:30:59:529] [test] [tid: 20418] [critical] critical msg, counter: 0 
  6. [2021-08-17 15:31:00:031] [test] [tid: 20418] [warning] warn msg, counter: 0 
  7. [2021-08-17 15:31:00:032] [test] [tid: 20418] [error] error msg, counter: 0 
  8. [2021-08-17 15:31:00:032] [test] [tid: 20418] [critical] critical msg, counter: 0 
  9. [2021-08-17 15:31:00:533] [test] [tid: 20418] [warning] warn msg, counter: 0 
  10. [2021-08-17 15:31:00:533] [test] [tid: 20418] [error] error msg, counter: 0 
  11. [2021-08-17 15:31:00:534] [test] [tid: 20418] [critical] critical msg, counter: 0 

測試源代碼以上傳碼云

地址:https://gitee.com/fensnote/demo_code/tree/master/cpp/spdlog

 

責任編輯:武曉燕 來源: 嵌入式技術筆記
相關推薦

2011-07-10 15:26:54

C++

2025-10-31 09:50:21

2009-04-12 09:19:27

Symbian諾基亞移動OS

2011-07-15 00:47:13

C++多態

2011-07-14 17:45:06

CC++

2011-07-13 18:24:18

C++

2015-11-26 10:24:04

日志監控監控工具

2010-01-18 15:40:37

Visual C++工

2011-07-05 13:24:03

C++

2023-11-22 12:25:05

C++RTTI

2020-07-30 12:40:35

CC++編程語言

2014-03-17 10:10:58

CC++編程書籍

2023-12-13 10:51:49

C++函數模板編程

2023-11-28 11:51:01

C++函數

2024-02-01 00:10:21

C++PIMPL編程

2010-01-25 13:31:27

C++程序

2011-04-08 17:24:05

c++工具編程

2019-09-06 09:36:28

Linux磁盤克隆

2011-07-15 01:38:56

C++this指針

2011-07-13 11:12:43

C++MFC
點贊
收藏

51CTO技術棧公眾號

国产香蕉视频在线看| 亚州av中文字幕在线免费观看| 亚洲图片88| 欧美国产激情二区三区| 国产精品成久久久久三级 | 日韩网站在线看片你懂的| 99热.com| 国产成人在线免费| 久久久综合亚洲91久久98| 国产一二三区av| 青青草国产成人a∨下载安卓| 国产视频精品在线| 92久久精品| 精品久久久久久久久久久久久久久| 高清hd写真福利在线播放| 成人精品视频网站| 欧美国产亚洲一区| 牛牛精品视频在线| 亚洲国产精品系列| 国产伦理精品| 精品国产1区2区3区| 亚洲精品一区| 色综合久久综合| 久草在线资源视频| 亚洲精品日日夜夜| 丝袜+亚洲+另类+欧美+变态| 亚洲一区二区综合| 欧美黑人孕妇孕交| 五月婷婷综合网| 国产精品一区二区婷婷| 精品久久久久久国产91| 成人伊人222| 欧美特级限制片免费在线观看| 在线观看v片| 91精品国产自产在线老师啪| 91不卡在线观看| 欧美日韩国产精选| 九色网友自拍视频手机在线| 日本道免费精品一区二区三区| 中文字幕在线播放| 精品夜色国产国偷在线| 国产成人久久精品麻豆二区| 久久久久久久久久久av| 青青草国产免费一区二区下载 | 国产精品一区二区免费在线观看| 久久久久久久网| 日本啊v在线| 亚洲人成在线免费观看| 色综合www| 热这里只有精品| 疯狂做受xxxx欧美肥白少妇 | 亚洲最新在线视频| 欧美黑人疯狂性受xxxxx野外| 午夜成人免费电影| 日本a级片久久久| 一区二区毛片| 久久久久久久影院| 亚乱亚乱亚洲乱妇| 国产91露脸合集magnet| 国产精品高潮视频| 合欧美一区二区三区| 插插插亚洲综合网| 欧美人与禽猛交乱配| 欧美激情一区二区三区成人| 国内视频精品| 羞羞视频立即看| 中文字幕精品在线| 麻豆国产精品视频| 成人免费网址| 久久免费精品视频| 岛国一区二区在线观看| 日韩精品分区| 97久久人人超碰caoprom欧美 | 亚洲国产精品高清久久久| 中文字幕亚洲精品乱码| 超碰96在线| 97超级碰碰人国产在线观看| 粉嫩嫩av羞羞动漫久久久| 手机av免费在线| 日韩欧美一区二区视频在线播放 | 日韩人妻精品一区二区三区| 日韩三级视频在线观看| 蜜桃视频第一区免费观看| 久草资源在线| 欧美精品欧美精品| 国产视频久久久久久久| 成人av午夜电影| 98视频精品全部国产| 91av俱乐部| 国产精品草莓在线免费观看| 精品色蜜蜜精品视频在线观看| 精品国产一区二区三区久久久樱花| 中文资源在线网| 亚洲一区二区在线看| 亚洲日本中文字幕免费在线不卡| 亚洲免费大片| 免费动漫网站在线观看| 亚洲国产精品一区二区第四页av| 亚洲女人被黑人巨大进入al| 一本久道久久综合狠狠爱| 成人国产精品一区二区网站| 亚洲专区在线视频| 欧美视频精品在线| 92精品国产成人观看免费| 欧美国产91| 国内精品久久久久久99蜜桃| 91p九色成人| 97影院秋霞午夜在线观看| 污黄色在线观看| 久久白虎精品| av天在线观看| 爱爱免费视频网站| 男女激情无遮挡| 视频一区二区在线| 欧美大陆一区二区| 亚洲人成77777| 国产精品99久久久久久久| 91精品免费视频| 日韩av片永久免费网站| 日本一区二区在线免费播放| 精品久久久三级丝袜| 色呦呦一区二区三区| 国产精品大尺度| 95精品视频在线| 成人午夜av影视| 国产午夜亚洲精品午夜鲁丝片| eeuss影院一区二区三区| 国产日韩欧美电影| 欧美性猛交xxxx富婆弯腰| 日韩免费成人网| 欧美性生交大片免网| 一区二区三区四区视频精品免费| 蜜臀久久99精品久久久久宅男| 日韩免费av| 偷拍自拍亚洲色图| 国产日韩中文在线中文字幕| 日本中文字幕一区二区| 国产精品区在线| 50路60路老熟妇啪啪| 国产在线观看精品| 成人区精品一区二区| 亚洲视频精品一区| 日本人视频jizz页码69| 中文在线a在线| 欧美激情免费| 男人在线资源站| 影音先锋另类| 91成人在线播放| 精品精品国产高清a毛片牛牛 | 日本一区二区三区四区视频| 亚洲图片欧美视频| 99精品桃花视频在线观看| 97在线精品| 国产精品羞羞答答在线观看| 小早川怜子影音先锋在线观看| 成人av视屏| 国产精品无码av在线播放| 久久亚洲午夜电影| 国产精品久久九九| 国产欧美日韩专区发布| 色噜噜狠狠色综合网| 久久精品久久久久| 中文字幕日韩一区| 美女网站色91| 野花国产精品入口| 欧美日韩第一区| 亚洲草久电影| 偷拍视屏一区| 91精品视频一区二区| 超碰97久久国产精品牛牛| 国产精品一区二区你懂的| 欧美高清日韩| 国产在线视频在线| 久久久久五月天| 懂色av一区二区夜夜嗨| 校园激情久久| 亚洲精品97| 91精品电影| 国产精品亚洲人成在99www| 成人在线超碰| 日韩一二三四| 中文字幕一区二区三区四区久久| 日韩亚洲欧美中文高清在线| 在线 亚洲欧美在线综合一区| 最新国产在线拍揄自揄视频| 免费看成人a| 成年人免费看的视频| 在线播放国产区| 午夜欧美福利视频| 国产极品在线视频| 日本精品一区二区三区四区| 免费欧美一级视频| 欧美 国产 日本| 中文字幕成人在线视频| 成视频免费在线看| 中文字幕2018| 免费av在线网站| a级日韩大片| 黑人巨大精品欧美一区免费视频| 国产一区二区三区在线看麻豆|