spdlog同时输出到控制台和文件中,可设置文件大小及数目,define方式

2023-10-27

因为自己想要个题目那种效果的,又没找到很符合的博客,就整合了下大佬们的博客封了个,具体的内容都放到代码注释里了,我这个目前在windows下只能将log文件创建到exe所处的目录中,暂时仍未解决该问题,欢迎大佬指正(已解决,直接将文件名设置为带路径的即可)

#ifndef __MY_LOG__
#define __MY_LOG__

#include <iostream>
#include <string>
#include <sstream>
#include <sys/stat.h>
#include <sys/types.h>


#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"
#include "spdlog/logger.h"

#include "spdlog/sinks/stdout_sinks.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/common.h"
#include "spdlog/sinks/rotating_file_sink.h"


using namespace spdlog;


#define LOG_TRACE(...)       SPDLOG::getInstance().logger().get()->trace(__VA_ARGS__)
#define LOG_DEBUG(...)       SPDLOG::getInstance().logger().get()->debug(__VA_ARGS__)
#define LOG_INFO(...)        SPDLOG::getInstance().logger().get()->info(__VA_ARGS__)
#define LOG_WARN(...)        SPDLOG::getInstance().logger().get()->warn(__VA_ARGS__)
#define LOG_ERROR(...)       SPDLOG::getInstance().logger().get()->error(__VA_ARGS__)
#define LOG_CRITICAL(...)    SPDLOG::getInstance().logger().get()->critical(__VA_ARGS__)

// spdlog打印信息格式
/*

LOG_WARN("Easy padding in numbers like {:08d}", 12);
//  [2021-04-07 23:49:24.916] [warning] Easy padding in numbers like 00000012

LOG_CRITICAL("Support for int: {0:d};  hex: {0:x};  oct: {0:o}; bin: {0:b}", 42);
//  [2021-04-07 23:49:24.916] [critical] Support for int: 42;  hex: 2a;  oct: 52; bin: 101010

LOG_INFO("Support for floats {1:06.4f}", 1.23456, 9.8754321);
//  [2021-04-07 23:49:24.916] [info] Support for floats 9.8754    

LOG_INFO("Positional args are {1} {0}..", "too", "supported");
//  [2021-04-07 23:49:24.916] [info] Positional args are supported too..

LOG_INFO("{:>8} aligned, {:<8} aligned", "right", "left");
//  [2021-04-07 23:49:24.916] [info]    right aligned, left     aligned

*/


/*
使用时先执行init方法,参数
std::string logger_name                  :生成日志文件的名称,默认为log
std::size_t max_size                      :单个日志文件的大小,默认为10mb
std::size_t max_files                     :最大日志数目,默认为10
*/
class SPDLOG
{
private:
	SPDLOG() = default;
	std::shared_ptr<spdlog::logger> logger_ptr_;

public:
	static SPDLOG& getInstance()
	{
		static SPDLOG instance;
		return instance;
	}
	void inline init(std::string logger_name = "log", std::size_t max_size = 1024*1024*10, std::size_t max_files = 10);
	std::shared_ptr<spdlog::logger> logger() { return logger_ptr_; }
};


void inline SPDLOG::init(std::string logger_name, std::size_t max_size, std::size_t max_files)
{
	try {

		/* 通过multi-sink的方式创建复合logger,实现方式为:先分别创建文件sink和控制台sink,并将两者放入sink 向量中,组成一个复合logger */

		/* file sink */
		auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(logger_name, max_size, max_files);
		file_sink->set_level(spdlog::level::trace);
		file_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] [%t] %v");

		/* 控制台sink */
		auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
		console_sink->set_level(spdlog::level::trace);
		console_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] [%t] %v");

		/* Sink组合 */
		std::vector<spdlog::sink_ptr> sinks;
		sinks.push_back(console_sink);
		sinks.push_back(file_sink);
		logger_ptr_ = std::make_shared<spdlog::logger>("multi-sink", begin(sinks), end(sinks));

		std::cout << "SPDLOG: create spdlog success!" << std::endl;
	}
	catch (const spdlog::spdlog_ex& ex) {
		perror("spdlog init error.");
	}
}

#endif


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spdlog同时输出到控制台和文件中,可设置文件大小及数目,define方式 的相关文章

  • 将 ARGB 拆分为字节值

    我有一个 ARGB 值存储为 int 类型 它是通过调用 ToArgb 来存储的 我现在想要来自 int 值的各个颜色通道的字节值 例如 int mycolor 16744448 byte r g b a GetBytesFromColor
  • 命名管道客户端无法连接到作为网络服务运行的服务器

    我有一个服务在网络服务帐户下运行 该服务只是设置一个命名管道并侦听连接 NamedPipeServerStream listeningPipe new NamedPipeServerStream ourservicepipe PipeDir
  • 错误:“运行所选代码生成器时出错:包恢复失败”

    我正在尝试将控制器添加到 ASP NET Core 项目中的解决方案中 当我尝试这样做时 我收到此错误 我收到相同的消息 为控制器添加最小依赖项和完整依赖项 我也有这个问题 使用实体框架添加控制器 gt 带有操作的 API 控制器 将给出
  • 等待运算符错误

    我的代码有问题 我怎么解决这个问题 这个问题出现在await操作符中 public MyModel HttpClient client new HttpClient HttpResponseMessage response await cl
  • 提取单花括号内的值

    我想要一个收藏 value 一个字符串使用正则表达式 例如 lorem ipsum field1 lorem ipsum field2 lorem ipsum field1 lorem ipsum field2 field3 我会得到 fi
  • 值类型如何实现引用类型

    我遇到了一个值类型正在实现 ref 的场景 类型 只是想知道这怎么可能 幕后发生了什么 结构体是值类型 接口是引用 类型但结构可以实现接口而不会出现任何错误 有什么想法吗 提前致谢 实际上 它同时以两种不同的方式进行 首先 任何值类型都可以
  • 使用 LINQ 展平嵌套字典

    所以我有一本形式的字典Dictionary
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • 如何生成可变参数包?

    给定不相关的输入是否可以生成非类型参数包 我的意思是 我想改变这一点 template
  • Web浏览器控件:如何捕获文档事件?

    我正在使用 WPF 的 WebBrowser 控件加载一个简单的网页 在这个页面上我有一个锚点或一个按钮 我想在我的应用程序后面的代码中 即在 C 中 捕获该按钮的单击事件 WebBrowser 控件是否有办法捕获加载页面元素上的单击事件
  • Cookie 在 ASP.net 中失去价值

    我有以下设置 cookie 的代码 string locale DropDownList this LoginUser FindControl locale SelectedValue HttpCookie cookie new HttpC
  • 如何将输出重定向到 boost 日志?

    我有一个使用boost log的C 程序 我加载了用户提供的动态链接库 我想将 stderr 重定向到 boost 日志 以便用户的库随时执行以下操作 std cerr lt lt Some stuff 它产生相同的结果 BOOST LOG
  • 当分配返回 0 时,具有空异常规范的运算符 new 调用构造函数

    我有以下声明 void operator new size t s PersistentMemory m throw return m gt allocatePersistentMemory s 我正在测试启动时的内存耗尽 这会导致m gt
  • C++ 模板参数数量错误(2,应该是 1)

    我使用 C 并行快速排序程序进行了测试 如下所示 首先使用列表作为容器 然后我转移到通用容器类型 但它报告了标题错误 可以帮忙解决这个问题吗 include
  • 使用“const cv::Mat &”、“cv::Mat &”、“cv::Mat”或“const cv::Mat”作为函数参数的区别?

    我已经彻底搜索过 但没有找到一个简单的答案 传递 opencv 矩阵 cv Mat 作为函数的参数 我们传递一个智能指针 我们对函数内部的输入矩阵所做的任何更改也会改变函数范围之外的矩阵 我读到 通过将矩阵作为 const 引用传递 它不会
  • 如何使用 .NET 捕获我的桌面视频?

    我想知道是否有任何方法可以使用 NET 捕获我的桌面的视频 截屏视频 我并不是在寻找截屏软件 而只是在寻找一种可以让我自己生成桌面视频的技术 我想过拍摄多个屏幕截图 但我不确定如何以编程方式生成带有图像序列的视频 有人有主意吗 Thanks
  • DbContext.SaveChangesAsync 异常处理

    当搭建新的脚手架时ApiController通过 Visual Studio 2013 中的异步操作和实体框架支持 某些方法可以包装DbContext SaveChangesAsync https msdn microsoft com en
  • 从其对象获取结构体字段的名称和类型

    例如 我有一个类似这样的结构 struct Test int i float f char ch 10 我有一个该结构的对象 例如 Test obj 现在 我想以编程方式获取字段名称和类型obj 是否可以 顺便说一句 这是 C 你正在要求C
  • 为什么 INT64_MIN 的定义不同?为什么他们的行为不同?

    The stdint h我公司的标题是 define INT64 MIN 9223372036854775808LL 但在我项目的一些代码中 一位程序员写道 undef INT64 MIN define INT64 MIN 92233720
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个

随机推荐

  • arxiv文章下载很慢怎么办?

    对于我们这样的深度学习屌丝来说 没钱 没资源 没数据 没时间 只能看看别人的论文生存了 经常会到arxiv上下载一些文章 比如cvpr的文章 但是 由于国内封锁 下载很慢 甚至接连几天打不开arxiv的网站 咋办 强烈推荐使用中科院arxi
  • usb描述符以及传输方式

    lsusb命令 Bus 002 表示第2个usb主控制器 Device 002 表示系统给usb鼠标分配的设备号 ID 8087 8002 Intel Corp 表示usb设备的ID 这个ID由芯片制造商设置 可以唯一表示该设备 8087
  • 洛谷P5731 【深基5.习6】蛇形方阵

    include
  • 电脑itunes,iTunes

    Music TV and podcasts take center stage iTunes forever changed the way people experienced music movies TV shows and podc
  • 内存管理之分段与分页

    内存管理之分段与分页 转载自多名技术分享者 仅供参考 第一篇 要理解分段和分页 那么得理解为什么会出现分段和分页的技术 首先 这两个技术都是为了利用和管理好计算机的资源 内存 在分段这个技术还没有出现之前 程序运行是需要从内存中分配出足够多
  • 【Verilog】Verilog定义二维数组(2D Array)

    目录 定义的种类 第一种 赋值方法 第二种 赋值方法 第三种 赋值方法 定义的种类 首先看几组定义类型 第一种 定义一个位宽为8的 data1 reg 和 data2 wire 的变量 reg 7 0 data1 wire 7 0 data
  • java.io.IOException: InvalidResourceRequestException: Invalid resource request

    1 背景 做一次kylin计算选择mr进行计算cube 但是报错 首先是 这一报错 报错打开是 yarn上的原因为 2019 05 09 15 07 38 495 ERROR Thread 52 org apache hadoop mapr
  • R文本挖掘之五情感分析

    本文是转载 原文地址 CSDN R语言做文本挖掘 Part5情感分析 Part5情感分析 这是这个系列里面最后一篇文章了 其实这里文本挖掘每一个部分单拎出来都是值得深究和仔细研究的 我还处于初级研究阶段 用R里面现成的算法 来实现自己的需求
  • java 多线程 并发实例_java编程多线程并发处理实例解析

    本文主要是通过一个银行用户取钱的实例 演示java编程多线程并发处理场景 具体如下 从一个例子入手 实现一个银行账户取钱场景的实例代码 第一个类 Account java 账户类 package cn edu byr test public
  • ctfshow-Misc入门 图片篇(50-60)

    八神出的misc入门系列 misc57 59做的比较晚了 本来想着等解了misc61一块发wp的 忙着比赛和推免就忘了 今天看到群里有人用g4 的工具一把梭了才想起来这个事 misc61等能把原理讲清楚了再发 图片篇 图片篇 颜色通道 mi
  • 经典运放电路详细分析(模拟电子技术)

    运放电路 何为运放电路 由运算放大器组成的电路 简称为运放电路 这些电路可以说是五花八门 是我们学习模拟电子技术的一个重要内容 更是一个电子工程师必须掌握的电路之一 运放电路有多种类型 是不是我们把它们牢牢记住就行了呢 显然不是啦 作为知识
  • Excel打开csv文件时中文内容显示为乱码或问号的解决办法

    有同事遇到这样一个问题 就是打开csv文件后 里面的中文显示乱码或者问号 网上找了很久 没有找到有效的解决方法 改非Unicode编码 windows显示语言 office显示语言都没有用 随后自己研究了一下 发现只要改一个地方就可以正常显
  • JWT校验

    JWT JSON Web Token 的缩写 由三部分组成 Header 头部 Payload 负载 Signature 签名 随着技术的发展 分布式web应用的普及 通过session管理用户登录状态成本越来越高 因此慢慢发展成为toke
  • 特征选择和特征理解

    特征选择和特征理解 特征选择 排序 对于数据科学家 机器学习从业者来说非常重要 好的特征选择能够提升模型的性能 更能帮助我们理解数据的特点 底层结构 这对进一步改善模型 算法都有着重要作用 特征选择主要有两个功能 减少特征数量 降维 使模型
  • Java List与ArrayList

    目录 List的介绍 什么是List List的使用 ArrayList与顺序表 ArrayList简介 ArrayList的使用 ArrayList的常见操作 ArrayList的扩容机制 ArrayList的模拟实现 List的介绍 什
  • 安卓绕过隐藏api限制

    安全设置 出于测试目的 Google 内置了一种在给定 Android 设备上全局禁用隐藏 API 限制的方法 标题为如何启用对非 SDK 接口的访问的问题中链接中的部分 说如下 您可以通过使用以下 adb 命令更改 API 强制策略来启用
  • 云上城之个服务器维护时间,云上城之歌幻乐之城开服时间表_云上城之歌新区开服预告_第一手游网手游开服表...

    今日开服 15 00 三十八区苍炎之门 已经开服 2021 08 10 10 00 三十八区巨石林野 已经开服 2021 08 09 15 00 三十八区荧光要塞 已经开服 10 00 三十八区雷神圣所 已经开服 2021 08 07 10
  • springboot 读取配置报错java.lang.IllegalArgumentException: Could not resolve placeholder ‘xxx.xxx‘

    springboot 读取配置报错java lang IllegalArgumentException Could not resolve placeholder xxx xxx 代码中写的是 Value xxx xxx 由于配置文件中没有
  • 协同无法关闭的问题之一

    StartCoroutine 方法名 和StartCoroutine 方法名 是不一样的 用StartCoroutine 方法名 无法用StopCoroutine 方法名 关闭协同 但是StartCoroutine 方法名 就可以用Stop
  • spdlog同时输出到控制台和文件中,可设置文件大小及数目,define方式

    因为自己想要个题目那种效果的 又没找到很符合的博客 就整合了下大佬们的博客封了个 具体的内容都放到代码注释里了 我这个目前在windows下只能将log文件创建到exe所处的目录中 暂时仍未解决该问题 欢迎大佬指正 已解决 直接将文件名设置