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++

2009-04-12 09:19:27

Symbian诺基亚移动OS

2011-07-15 00:47:13

C++多态

2011-07-14 17:45:06

CC++

2015-11-26 10:24:04

日志监控监控工具

2011-07-13 18:24:18

C++

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++编程书籍

2024-02-01 00:10:21

C++PIMPL编程

2023-11-28 11:51:01

C++函数

2023-12-13 10:51:49

C++函数模板编程

2010-01-25 13:31:27

C++程序

2011-04-08 17:24:05

c++工具编程

2019-09-06 09:36:28

Linux磁盘克隆

2010-01-28 14:33:58

C++Test工具

2011-07-15 01:38:56

C++this指针

2011-07-13 11:12:43

C++MFC
点赞
收藏

51CTO技术栈公众号