首页 > 其他分享 >Spdlog日志库的使用,支持文件名/行号/函数名的log打印输出

Spdlog日志库的使用,支持文件名/行号/函数名的log打印输出

时间:2022-08-31 17:22:27浏览次数:96  
标签:std set log 打印输出 SPDLOG spdlog 日志 logger Spdlog

一、简介

spdlog是基于C++ 11的日志组件,它非常轻量,使用时你仅仅需要引入头文件就可以了。

https://github.com/gabime/spdlog

https://github.com/gabime/spdlog/wiki/3.-Custom-formatting

 

二、线程安全

命名空间 spdlog:: 下面的大多数方法是线程安全的。已知以下三个是线程不安全的,使用时请注意:

void spdlog::set_pattern(const std::string&);

void spdlog::set_formatter(formatter_ptr);

void spdlog::set_error_handler(log_err_handler);

日志对象的大部分方法也是线程安全的,除了以下三个:

void spdlog::logger::set_pattern(const std::string&);
void spdlog::logger::set_formatter(formatter_ptr);
void spdlog::set_error_handler(log_err_handler);
 

三、使用示例

函数名带后缀_mt的意思是multi thread(速度稍微慢一点点,考虑了多线程并发),_st的意思是single thread(速度较块)。所有以_mt结尾的SINK都是线程安全的,以_st结尾的则不是。

 
  #include "spdlog/spdlog.h"   #include <iostream>       // 多线程的基于控制台(stdout)的日志记录器,支持高亮。类似的stdout_color_st是单线程版本   auto console = spdlog::stdout_color_mt( "console" );   // 基于文件的简单日志   auto logger = spdlog::basic_logger_mt("basic_logger", "logs/basic.txt");   // 基于滚动文件的日志,每个文件5MB,三个文件   auto logger = spdlog::rotating_logger_mt("file_logger", "myfilename", 1024 * 1024 * 5, 3);       // 定制输出格式   spdlog::set_pattern("*** [%H:%M:%S %z] [thread %t] %v ***");       // 多个日志器共享SINK   auto daily_sink = std::make_shared<spdlog::sinks::daily_file_sink_mt>("logfile", 23, 59);   // 下面几个同步日志器共享的输出到目标文件   auto net_logger = std::make_shared<spdlog::logger>("net", daily_sink);   auto hw_logger = std::make_shared<spdlog::logger>("hw", daily_sink);   auto db_logger = std::make_shared<spdlog::logger>("db", daily_sink);       // 一个日志器使用多个SINK   std::vector<spdlog::sink_ptr> sinks;   sinks.push_back( std::make_shared<spdlog::sinks::stdout_sink_st>());   sinks.push_back( std::make_shared<spdlog::sinks::daily_file_sink_st>( "logfile", 23, 59 ));   auto combined_logger = std::make_shared<spdlog::logger>( "name", begin( sinks ), end( sinks ));   spdlog::register_logger( combined_logger );       // 异步   // 每个日志器分配8192长度的队列,队列长度必须2的幂   spdlog::set_async_mode(8192);   // 程序退出前清理   spdlog::drop_all();       // 注册日志器   spdlog::register_logger(net_logger);   // 注册后,其它代码可以根据名称获得日志器   auto logger = spdlog::get(net_logger);       // 记录日志   // 设置最低级别   console->set_level(spdlog::level::debug);   console->debug("Hello World") ;   // 使用占位符   console->info("Hello {}" ,"World");   // 带格式化的占位符:d整数,x十六进制,o八进制,b二进制   console->warn("Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42);   // 带格式化的占位符:f浮点数   console->info("Support for floats {:03.2f}", 1.23456);   // 左对齐,保证30字符宽度   console->error("{:<30}", "left aligned");   // 指定占位符位置序号   console->info("Positional args are {1} {0}..", "too", "supported");       // 记录自定义类型,需要重载<<操作符   #include <spdlog/fmt/ostr.h>   class Duck{}   std::ostream& operator<<(std::ostream& os, const Duck& duck){   return os << duck.getName();   }   Duck duck;   console->info("custom class with operator<<: {}..", duck);
 
 

 

四、我个人的使用示例

 
  #define SPDLOG_NAME "SmartDispenser"   #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE//必须定义这个宏,才能输出文件名和行号   #include <spdlog/spdlog.h>   #include <spdlog/sinks/rotating_file_sink.h>       bool CInitSoft::initLog(void)   {   //初始化日志spdlog,https://github.com/gabime/spdlog   CString strFilePath = FILEMANAGE->GetLogsDir() + _T("\\logApp.txt");   std::string logpath = CT2A(strFilePath.GetBuffer());   strFilePath.ReleaseBuffer();       try   {   auto rotating_logger = spdlog::rotating_logger_mt(SPDLOG_NAME, logpath, 1024 * 1024 * 1, 3);   spdlog::set_default_logger(rotating_logger);   rotating_logger->set_level(spdlog::level::debug);   //输出格式请参考https://github.com/gabime/spdlog/wiki/3.-Custom-formatting   rotating_logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e][thread %t][%@,%!][%l] : %v");       #if _DEBUG   rotating_logger->debug("test1");//不会输出文件名和行号   spdlog::get(SPDLOG_NAME)->info("test2");//   SPDLOG_LOGGER_DEBUG(rotating_logger, "test3 {}", 3);//会输出文件名和行号   int a = 4;   SPDLOG_LOGGER_DEBUG(rotating_logger, "test4 {}", a);   SPDLOG_DEBUG("test5");   #endif   }   catch (const spdlog::spdlog_ex& ex)   {   std::cout << "Log initialization failed: " << ex.what() << std::endl;   CString info;   info.Format(_T("log init failed: %s\n"), ex.what());   addInitInfo(theApp.MyMsgString(_T("日志初始化失败!"), info));   return false;   }       return true;   }
 
 

请重点关注:

#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE//必须定义这个宏,才能输出文件名和行号

SPDLOG_LOGGER_DEBUG(rotating_logger, "test3 {}", 3);//会输出文件名和行号

 

五、姊妹篇

Qt日志重定向qInstallMessageHandler,输出至文件及网络

Qt日志库Log4Qt的使用,支持文件名/行号/函数名的打印输出

 

 

标签:std,set,log,打印输出,SPDLOG,spdlog,日志,logger,Spdlog
From: https://www.cnblogs.com/lidabo/p/16643830.html

相关文章

  • C# winform 配置log4net
    Winform配置了Log4net但是总是不能输出,是log4net.config配置文件访问路径出错了。 就是程序在运行时候没把log4net.config配置文件复制到Debug文件夹下,导致log4net访问......
  • log4j处理方式
     ElasticSearchLog4j版本升级方法,涉及到log4j的都适用处理思路1、下载最新版编译好的Log4j的jar包2、解压后,找到如下四个文件,并上传到服务器3、删除服务器上低版......
  • verilog 中的三段式状态机
    抄的:https://zhuanlan.zhihu.com/p/431143109一段式状态机特点:最主要的特征是只有一个always块。在这个always块内既描述状态转移,又含有组合逻辑输入/输出,当前状态用......
  • Android logcat命令详解
    一、logcat命令介绍1.androidlog系统 2.logcat介绍logcat是android中的一个命令行工具,可以用于得到程序的log信息log类是一个日志类,可以在代码中使用logcat打印......
  • 项目实用-logback.xml配置-sql和异常在不同的文件中
    <configuration><!--本文主要输出日志为控制台日志,系统日志,sql日志,异常日志--><!--%m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,,,,--><!--控制台-......
  • 计算机体系结构--指令Cache设计verilog实现
    前段时间一直在做MIPSCPU的设计,并且同步学习了一些计算机体系结构的相关知识,五级流水线单周期CPU设计已经完善了,本文主要记录一下指令Cache的设计及实现。一、Cache设计......
  • vsftp日志xferlog格式分析
    1、开始vsftp记录日志。修改/etc/vsftpd/vsftpd.conf如下:xferlog_enable=YESxferlog_std_format=YESxferlog_file=/var/log/xferlogFTP服务器的日志设置,可以通过修改主......
  • logstash获取重复数据,偏移量文件不更新数据的原因及解决办法
    logstash配置文件如下:#将mysql数据库里面的增量数据发送个kafka,然后消费kafka的数据进行采集,在server05服务器运行#先执行一下source/etc/profile,让java的路径生效#......
  • ELK技术-Logstash
     1.背景1.1简介Logstash是一个功能强大的工具,可与各种部署集成。它提供了大量插件,可帮助业务做解析,丰富,转换和缓冲来自各种来源的数据。Logstash是一个数据流引......
  • 不想当Window的Dialog不是一个好Modal,弹窗翻身记
    弹窗是我们熟视无睹的一种交互方式,经常用到,但从没好好想过这种交互行为背后的意义...弹窗是Windows的灵魂Windows的灵魂是什么?当然是Window,当方便快捷的多窗口进入人们视......