C++ 日志管理 spdlog 使用笔记

news2025/1/15 13:27:59

文章目录

  • Part.I Introduction
    • Chap.I 预备知识
    • Chap.II 常用语句
  • Part.II 使用
    • Chap.I 简单使用
    • Chap.II 自定义日志格式
  • Part.III 问题&解决方案
    • Chap.I 如果文件存在则删除
  • Reference

Part.I Introduction

spdlog 是一个开源的 C++ 日志管理工具,Git 上面的地址为

Git 仓库:https://github.com/gabime/spdlog

在这里插入图片描述

Chap.I 预备知识

下面是使用 spdlog 前需要了解的一些东西

  • 日志等级:trace(T) < debug(D) < info(I) < warn(W) < err(E) < critical(C ) < offoff 表示关闭,举个例子,如果设置的日志等级为 info,那么 debug 和 trace 的信息将不会显示,只会显示等级大于等于 info 的日志。默认的日志等级为 info
  • 日志类型:CONSOLEROTATINGBASICDAILY

Chap.II 常用语句

下面是一些常用语句

spdlog::set_pattern("[%Y-%m-%d %T] [%^%L%$] %v");		// 设置日志格式
SPDLOG_TRACE("Some trace message with param {}", 42);	// 这两个好像不会输出,改变日志等级也不会,spdlog::trace 就可以
SPDLOG_DEBUG("Some debug message with param {}", 42);	
SPDLOG_INFO("Some info message with param {}", 42);		// 不同等级的日志输出
SPDLOG_WARN("Some warn message with param {}", 42);
SPDLOG_ERROR("Some error message with param {}", 42);
SPDLOG_CRITICAL("Some critical message with param {}", 42);
spdlog::info("Welcome to spdlog!");						// 或者用这种格式
spdlog::set_level(spdlog::level::info);					// 设置日志输出等级

SPDLOG_LEVEL_TRACE()
SPDLOG_LEVEL_DEBUG()
SPDLOG_LEVEL_INFO()
SPDLOG_LEVEL_WARN()
SPDLOG_LEVEL_ERROR()
SPDLOG_LEVEL_CRITICAL()

Part.II 使用

使用的时候,只需要 include/ 文件夹就行了。比如,使用 VS Studio 可以选中项目→右键→属性→C/C++→常规→附加包含目录→编辑→把include/ 文件的路径加入进去即可。

实际上,上面这种方法几乎适用于以 VS Studio 作为编译环境的,所有三方库的添加。 另外,还可以用 cmake 来添加。

Chap.I 简单使用

根据官方说明文档,可直接这样使用,

#include <iostream>
#include "spdlog/spdlog.h"

using namespace std;

int main()
{
    spdlog::info("Welcome to spdlog!");
    spdlog::error("Some error message with arg: {}", 1);

    spdlog::warn("Easy padding in numbers like {:08d}", 12);
    spdlog::critical("Support for int: {0:d};  hex: {0:x};  oct: {0:o}; bin: {0:b}", 42);
    spdlog::info("Support for floats {:03.2f}", 1.23456);
    spdlog::info("Positional args are {1} {0}..", "too", "supported");
    spdlog::info("{:<30}", "left aligned");

    spdlog::set_level(spdlog::level::debug); // Set global log level to debug
    spdlog::debug("This message should be displayed..");

    // change log pattern
    spdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");

    // Compile time log levels
    // define SPDLOG_ACTIVE_LEVEL to desired level
    SPDLOG_TRACE("Some trace message with param {}", 42);
    SPDLOG_DEBUG("Some debug message");
    getchar();
}

Chap.II 自定义日志格式

spdlog 默认的输出格式为:

[2014-31-10 23:46:59.678] [info] [my_loggername] Some message

要定制输出格式,可以调用:

spdlog::set_pattern(pattern_string);
//示例
spdlog::set_pattern("***[%H:%M:%S %z] [thread %t] %v***");

或者实现自己的格式化器:

spdlog::set_formatter(std::make_shared<my_custom_formatter>());

输出格式的Pattern中可以有若干%开头的标记,含义如下表:

标记说明
%v实际需要被日志记录的文本,如果文本中有{占位符}会被替换
%t线程标识符
%P进程标识符
%n日志记录器名称
%l日志级别
%L日志级别简写
%^转换为大写字母
%$转换为彩色输出
%a简写的周几,例如Thu
%A周几,例如Thursday
%b简写的月份,例如Aug
%B月份,例如August
%c日期时间,例如 Thu Aug 2315:35:46 2014
%C两位年份,例如14
%Y四位年份,例如2014
%D或%xMM/DD/YY格式日期,例如"08/23/14
%m月份,1-12之间
%d月份中的第几天,1-31之间
%H24小时制的小时,0-23之间
%l12小时制的小时,1-12之间
%M分钟,0-59
%S秒,0-59
%e当前秒内的毫秒,0-999
%f当前秒内的微秒,0-999999
%F当前秒内的纳秒,0-999999999
%pAM或者PM
%r12小时时间,例如 02:55:02 pm
%R等价于%H:%M,例如23:55
%T或%XHH:MM:SS
%z时区UTC偏移,例如+02:00
%+表示默认格式

下面是笔者常用的设置

spdlog::set_pattern("[%Y-%m-%d %T] [%^%L%$] %v");
SPDLOG_INFO("Some info message with param {}", 42);
// -------------- 样式如下 ---------------
[2023-07-07 12:16:41] [I] Some info message with param 42

Part.III 问题&解决方案

Chap.I 如果文件存在则删除

在原 log 文件存在的情况下,使用 spdlog 会报错。所以需要自己添加代码把原 log 文件给删除。

#include <sys/stat.h>

struct stat buffer;
if (stat(str_log_name.c_str(), &buffer) == 0)
{// if the file exists, remove it.
    remove(str_log_name.c_str());
}

Reference

  • spdlog GitHub 仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2225806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ovis原理解读: 多模态大语言模型的结构嵌入对齐

论文&#xff1a;https://arxiv.org/pdf/2405.20797 github:https://github.com/AIDC-AI/Ovis 在多模态大语言模型 (MLLM) 中&#xff0c;不同的嵌入策略有显著的区别。以下是使用基于连接器的方法与 Ovis 方法的比较&#xff1a; 基于连接器的方法-优缺点(connector-based …

WPF+MVVM案例实战(十)- 水波纹按钮实现与控件封装

文章目录 1、运行效果1、封装用户控件1、创建文件2、依赖属性实现 2、使用封装的按钮控件1.主界面引用2.按钮属性设置 3 总结 1、运行效果 1、封装用户控件 1、创建文件 打开 Wpf_Examples 项目&#xff0c;在 UserControlLib 用户控件库中创建按钮文件 WaterRipplesButton.x…

产品结构设计(五):结构设计原则

1. 产品结构设计总原则 1.1 合理选用材料 1、根据产品应用场所来选择 如果为日常消费类电子产品&#xff0c;产品材料就应选用强度好、表面容易处理、不容易氧化生锈、不容易磨伤、易成型的材料&#xff0c;如塑胶材料选用 PC、ABS、PCABS 等&#xff0c;金属材料选用不锈钢、…

一些待机电流波形特征

一、待机电流波形 最干净的待机电流波形应该只有paging&#xff0c;不过需要注意2点&#xff1a; 每个paging的间隔&#xff0c;不同网络可能不一样&#xff0c;有可能是320ms, 640ms 待机网络 paging 间隔 1分钟的耗电量 单个耗电量 单个待机电流 单个波形时长 4G 64…

你了解kafka消息队列么?

消息队列概述 一. 消息队列组件二. 消息队列通信模式2.1 点对点模式2.2 发布/订阅模式 三. 消息队列的优缺点3.1 消息队列的优点3.2 消息队列的缺点 四. 总结 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&…

uniapp使用easyinput文本框显示输入的字数和限制的字数

uniapp使用easyinput文本框显示输入的字数和限制的字数 先上效果图&#xff1a; 整体代码如下&#xff1a; <template><view class"nameInfoContent"><uni-easyinput class"uni-mt-5" suffixIcon"checkmarkempty" v-model&quo…

Linux云计算 |【第五阶段】CLOUD-DAY4

主要内容&#xff1a; Linux容器基础、安装Docker、镜像管理、容器管理、容器部署应用 一、容器介绍 容器&#xff08;Container&#xff09; 是一种轻量级的虚拟化技术&#xff0c;用于在操作系统级别隔离应用程序及其依赖项。容器允许开发者在同一台主机上运行多个独立的应…

MaskGCT,AI语音克隆大模型本地部署(Windows11),基于Python3.11,TTS,文字转语音

前几天&#xff0c;又一款非自回归的文字转语音的AI模型&#xff1a;MaskGCT&#xff0c;开放了源码&#xff0c;和同样非自回归的F5-TTS模型一样&#xff0c;MaskGCT模型也是基于10万小时数据集Emilia训练而来的&#xff0c;精通中英日韩法德6种语言的跨语种合成。数据集Emili…

《数字图像处理基础》学习03-图像的采样

在之前的学习中我已经知道了图像的分类&#xff1a;物理图像和虚拟图像。《数字图像处理基础》学习01-数字图像处理的相关基础知识_图像处理 数字-CSDN博客 目录 一&#xff0c;连续图像和离散图像的概念 二&#xff0c;图像的采样 1&#xff0c; 不同采样频率采样同一张图…

SSA-CNN-LSTM-MATT多头注意力机制多特征分类预测

SSA-CNN-LSTM-MATT多头注意力机制多特征分类预测 目录 SSA-CNN-LSTM-MATT多头注意力机制多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现SSA-CNN-LSTM-MATT麻雀算法优化卷积神经网络-长短期记忆神经网络融合多头注意力机制多特征分类预测&…

ComfyUI - 视觉基础任务 检测(Detection) 和 分割(Segmentation) 的 Impact-Pack 流程 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/141140498 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 在 Com…

【音视频 | ADPCM】音频编码ADPCM详细介绍及例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

租房市场新动力:基于Spring Boot的管理系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

深入理解数据链路层:以太网帧格式、MAC地址、交换机、MTU及ARP协议详解与ARP欺骗探究

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 数据链路层 认识以太网以太网帧格式 认识 MAC 地址交换机与碰撞域的划分认识 MTUMTU 对 IP 协议的影响MTU 对 UDP 协议的影响 MTU 对…

SolidWorks 导出 URDF 中的惯性矩阵错误问题

系列文章目录 前言 一、 dsubhasish09于2021年5月23日发表评论 在装配体中定义由多个零件组成的 link 时&#xff0c;单个零件质心处各自的惯性值&#xff08;在使用相似性变换使其与关节坐标系平行后&#xff09;会直接相加&#xff0c;从而得到净惯性矩阵&#xff0c;而不是…

使用linuxdeployqt打包Qt程序问题及解决方法

dpkg: 处理归档 libmysqlclient18_5.6.25-0ubuntu1_amd64.deb (--install)时出错: 预依赖问题 - 将不安装libmysqlclient18:amd64 在处理时有错误发生: libmysqlclient18_5.6.25-0ubuntu1_amd64.deb下载libmysqlclient18/5.6.25 libmysqlclient18/5.6.25-0ubuntu1 安装 s…

如何把图片转换成pdf?这几种转换方法看了就能学会!

如何把图片转换成pdf&#xff1f;在当今这个高度数字化的世界里&#xff0c;图片文件和PDF文件无疑是我们日常生活中最常接触到的两种文件格式&#xff0c;它们各自拥有独特的特性和功能&#xff0c;为我们的工作与生活带来了诸多便利&#xff0c;图片文件&#xff0c;以其卓越…

Android Activity SingleTop启动模式使用场景

通知栏 当用户点击通知栏中的通知时,可以使用单顶启动模式来打开对应的活动,并确保只有一个实例存在。 简单集成极光推送 创建应用 获取appkey参数 切换到极光工作台 极光sdk集成 Project 根目录的主 gradle 配置 Module 的 gradle 配置 Jpush依赖配置 配置推送必须…

乐维网管平台(一):如何精准掌控 IP 管理

业网络已成为支撑业务运转的关键基础设施&#xff0c;而在企业网络管理中&#xff0c;IP 管理至关重要&#xff0c;它就像是网络秩序的守护者&#xff0c;确保网络的高效运行、安全可靠。 一、为什么企业要进行 IP 管理 1. 优化资源分配 IP 地址作为网络中的重要资源&#xf…

c++数据结构算法复习基础--7--线性表-队列-常用操作接口-复杂度分析

1、队列 特点&#xff1a;先进先出&#xff0c;后进后出 环形队列&#xff08;依赖数组实现&#xff0c;单必须实现环形&#xff09; 链式队列&#xff08;依赖链表实现&#xff09; 2、环形队列 理论 常规数组思想随着队列的不断使用&#xff0c;会出现越界 所以要将其…