c++日志工具spdlog

spdlog日志是纯头文件,使用起来比较方便。使用时只需要简单的初始化即可,这里对其初始化做了一个简单的封装,这样使用起来更加方便。

封装类代码

头文件

cspdlog.h

#ifndef _CSPDLOG_H_
#define _CSPDLOG_H_#include "spdlog/spdlog.h"
#include "spdlog/fmt/bin_to_hex.h"
#include <memory>
#include <string>class CSpdlog
{protected:CSpdlog();~CSpdlog();static CSpdlog *m_instance;public:static CSpdlog *GetInstance();void Init(const std::string & name,const std::string &logPath, std::size_t max_size=1048576, std::size_t max_file = 2);void SetConsoleLogLevel(spdlog::level::level_enum log_level);void SetFileLogLevel(spdlog::level::level_enum log_level);private:std::vector<spdlog::sink_ptr> m_sinks;std::shared_ptr<spdlog::logger> m_logger;
};#endif

源文件

cspdlog.cpp

#include "cspdlog.h"#include <cstdio>
#include <iostream>
#include "spdlog/sinks/stdout_color_sinks.h" // or "../stdout_sinks.h" if no color needed
#include "spdlog/sinks/basic_file_sink.h"
#include "spdlog/sinks/rotating_file_sink.h"CSpdlog::CSpdlog()
{}CSpdlog::~CSpdlog()
{}void CSpdlog::Init(const std::string & name, const std::string &log_path, std::size_t max_size, std::size_t max_file )
{try {      auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();console_sink->set_level(spdlog::level::debug);console_sink->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%n] [tid: %t] [%l] %v%$");std::string logFile = log_path + "/" + name + ".txt";//auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/multisink.txt", false);auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(logFile, max_size, max_file);file_sink->set_pattern("[%Y-%m-%d %H:%M:%S:%e] [%n] [tid: %t] [%l] %v");file_sink->set_level(spdlog::level::warn);m_sinks.push_back(console_sink);m_sinks.push_back(file_sink);//spdlog::logger *logger = new spdlog::logger("multi_sink", {console_sink, file_sink});m_logger = std::make_shared<spdlog::logger>(name, begin( m_sinks ), end( m_sinks ));//spdlog::set_error_handler([](const std::string& msg){printf("*****Custom log error handler, %s*****%\n", msg.c_str());});//注册到spdlog里spdlog::register_logger(m_logger);//m_logger->info("log init done.");m_logger->flush_on(spdlog::level::level_enum::warn);    }catch (const spdlog::spdlog_ex &ex){std::cout<<"Log initialization faild"<<ex.what()<<std::endl;}
}void CSpdlog::SetConsoleLogLevel(spdlog::level::level_enum log_level)
{m_logger->set_level(log_level);
}void CSpdlog::SetFileLogLevel(spdlog::level::level_enum log_level)
{m_sinks[1]->set_level(log_level);
}CSpdlog* CSpdlog::m_instance = NULL;CSpdlog* CSpdlog::GetInstance()
{if ( m_instance == NULL ){m_instance = new CSpdlog;}return m_instance;
}

测试主程序

#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <cspdlog.h>using namespace std;int main()
{CSpdlog::GetInstance()->Init("test","./log"); //初始化日志CSpdlog::GetInstance()->SetConsoleLogLevel(spdlog::level::debug); //设置终端界面输出级别CSpdlog::GetInstance()->SetFileLogLevel(spdlog::level::warn);     //设置log文件输出级别auto logger = spdlog::get("test");   //获取日志句柄logger->warn("test start.");int counter = 0;  while(1){logger->debug("debug msg, counter: {}",counter);logger->info("info msg, counter: {}",counter);logger->warn("warn msg, counter: {}",counter);logger->error("error msg, counter: {}",counter);logger->critical("critical msg, counter: {}",counter);logger->trace("trace msg, counter: {}",counter);usleep(500000);}return 0;
}

编译运行

我的通用Makefile

#通用makefile
#文件目录
DEBUG_DIR=.
SRC_DIR=.
INC_DIR=. ./spdlogSRC=$(wildcard $(SRC_DIR)/*.cpp )  #源文件
OBJS=$(patsubst $(SRC_DIR)/%.cpp,$(DEBUG_DIR)/%.o,$(SRC))#目标文件名
TARGET=test
INSTALL_PATH ?= .#修改编译器
ARCH ?=
CC=$(ARCH)gcc
CPP=$(ARCH)g++
AR=$(ARCH)ar
STRIP=$(ARCH)stripCFLAGS += -Wall -std=c++11
LDFLAGS += -lpthreadCFLAGS  += $(foreach dir,$(INC_DIR),-I$(dir))all:$(TARGET)
$(TARGET): $(OBJS)$(CPP) $(OBJS) -o $@ $(CFLAGS) $(LDFLAGS)$(STRIP) $(TARGET)
#cp $(TARGET) $(INSTALL_PATH)$(DEBUG_DIR)/%.o: $(SRC_DIR)/%.cpp$(CPP) $(CFLAGS) -c $< -o $@ #@echo $(SRC)
#@echo $(OBJS)clean:-rm $(OBJS) $(LIB_TARGET)

编译

make
g++ -Wall -std=c++11 -I. -I./spdlog -c cspdlog.cpp -o cspdlog.o
g++ -Wall -std=c++11 -I. -I./spdlog -c main.cpp -o main.o
g++ ./cspdlog.o ./main.o -o test -Wall -std=c++11 -I. -I./spdlog
strip test

运行

console输出:

文件输出:

$cat log/test.txt
[2021-08-17 15:30:59:526] [test] [tid: 20418] [warning] test start.
[2021-08-17 15:30:59:527] [test] [tid: 20418] [warning] warn msg, counter: 0
[2021-08-17 15:30:59:528] [test] [tid: 20418] [error] error msg, counter: 0
[2021-08-17 15:30:59:529] [test] [tid: 20418] [critical] critical msg, counter: 0
[2021-08-17 15:31:00:031] [test] [tid: 20418] [warning] warn msg, counter: 0
[2021-08-17 15:31:00:032] [test] [tid: 20418] [error] error msg, counter: 0
[2021-08-17 15:31:00:032] [test] [tid: 20418] [critical] critical msg, counter: 0
[2021-08-17 15:31:00:533] [test] [tid: 20418] [warning] warn msg, counter: 0
[2021-08-17 15:31:00:533] [test] [tid: 20418] [error] error msg, counter: 0
[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

微信公众号

fensnote

C++11日志之spdlog相关推荐

  1. Log:日志之 Spdlog 极简用法示范『二』

    文章目录 关联 背景 用法示范 spdlog 输出到终端 spdlog 输出到文件 其它用法 成系列地址 简 述: 有上一篇中通过日志调研选型,决定采用 Spdlog 后,此篇开始介绍一些基础入门,先 ...

  2. c++日志工具spdLog

    c++日志工具spdLog简单使用示例代码 spdlog直接引用头文件就可以使用,这一点还是比较方便的,也是刚入门使用,下面是在源码的示例代码基础上修改测试的代码: #include <cstd ...

  3. logback1.1.11日志无法自动删除

    项目使用logback记录日志,版本为1.1.11,配置了日志自动删除逻辑(应用启动就删除过往日志),但是往期日志文件始终没有被删除,越积越多,logback配置如下: <?xml versio ...

  4. Go语言学习之11 日志收集系统kafka库实战

    本节主要内容: 1. 日志收集系统设计 2. 日志客户端开发 1. 项目背景     a. 每个系统都有日志,当系统出现问题时,需要通过日志解决问题     b. 当系统机器比较少时,登陆到服务器上查 ...

  5. 【C++ spdlog】C++ 日志库 spdlog 使用

    1.在 https://github.com/gabime/spdlog 处下载源文件: 2.下载后解压,将得到以下文件,其中include文件夹里是所需的头文件及源码: 3.新建一个C++控制台应用 ...

  6. spdlog linux编译出错,c++日志库spdlog

    /*需要包含的头文件*/ #include "spdlog/spdlog.h" #include // EXIT_FAILURE #include #include void as ...

  7. vs debug 模式生成的exe 另一台电脑_C++利用spdlog生成日志

    环境:Win10-x64+VS2015 spdlog是一个快速的C++日志库,能够兼容C++11,具备快速.无需依赖第三方库.支持多线程.多平台的优良特性! 下载编译spdlog 1.第一步,下载sp ...

  8. spdlog日志库说明文档(超详细)

    spdlog日志库说明文档(超详细) spdlog是一个开源.快速.只有头文件的C++11日志库,code地址在https://github.com/gabime/spdlog,基础示例在https: ...

  9. LINUX 日志操作c/c++ spdlog

    spdlog spdlog是一个开源的.快速的.仅有头文件的C++11 日志库,code地址在 https://github.com/gabime/spdlog ,目前最新的发布版本为0.14.0.它 ...

最新文章

  1. 瞄准自然语言处理,百度与鹏城实验室共建实验室
  2. wordpress如何让百度快速收录_百度快速收录权益获取与使用说明
  3. VTK:灯光之SpotLights
  4. 设计模式 之 工厂模式
  5. Azure 内容审查器之文本审查
  6. 互联网和大数据是什么意思_何为互联网大数据?为什么每个人在数据的面前,相当于一丝不挂?...
  7. 【USACO1.1】Broken Necklace
  8. 12 操作系统第三章 内存管理 非连续分配管理方式 基本分页存储管理 基本分段存储管理 段页式存储管理
  9. linux6.6 sudo环境变量,linux sudo环境变量设置
  10. SAP中的默认帐户与密码
  11. 【Oracle 数据迁移】环境oracle 11gR2,exp无法导出空表的表结构【转载】
  12. MySQL 5.7--多源复制(非GTID模式)
  13. python从入门到实践答案第四章_《python从入门到实践》--第四章基本操作列表 重点及课后练习...
  14. centos7的php5.4竟然不支持原生的mysql
  15. 从0开始学习 GitHub 系列之「08.如何发现优秀的开源项目」
  16. ajax的data数据无意间的致命错误
  17. echart添加点击跳转链接事件多次跳转的问题
  18. 【SAS系列】SAS入门书籍推荐
  19. 全网最全讲解最详细的PS教程(第一期:基础教程1.0)
  20. Redis 集合排序

热门文章

  1. Android|Toast理论篇(附自制图标信息框实现)
  2. UMP系统功能 资源管理
  3. 关于webpack面试题
  4. 复合仿射函数的共轭函数推导
  5. 【RL-TCPnet网络教程】第7章 RL-TCPnet网络协议栈移植(裸机)
  6. Android Studio类微信界面设计
  7. 赶紧收藏 | 50个超实用微信小程序,巨好用|||内含免费配音软件
  8. win8计算机无法睡眠,win8电脑无法进入到睡眠状态怎么办?
  9. MATLAB矩阵乘法、MATLAB矩阵的转置、MATLAB串联矩阵
  10. 记录一次定位视频通话 音视频卡顿的原因分析过程。