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

文章目录

  • 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 仓库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在html中引用unpkg的vue3,v-model无法绑定方法

如果用下面代码引用vue使用&#xff0c;则注意v-model无法绑定方法。 <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> 例如&#xff1a; <span>方法-全名&#xff1a;</span><input type"text" v-model&…

如何将原本打开Edge呈现出的360浏览器,更换成原本的Edge页面或者百度等其他页面

每次打开Edge浏览器&#xff0c;都会呈现出360浏览器的页面&#xff0c;很烦。以下将说明如果将呈现出的360浏览器&#xff0c;更换成原本的Edge页面或者百度等其他页面。 1.找到你的控制面板&#xff0c;点击卸载程序。 2. 找到360安全卫士&#xff0c;右键单击更改/卸载。 3…

【深度学习|地学应用】人工智能技术的发展历程与现状:探讨深度学习在遥感地学中的应用前景

【深度学习|地学应用】人工智能技术的发展历程与现状&#xff1a;探讨深度学习在遥感地学中的应用前景 【深度学习|地学应用】人工智能技术的发展历程与现状&#xff1a;探讨深度学习在遥感地学中的应用前景 文章目录 【深度学习|地学应用】人工智能技术的发展历程与现状&…

抖音评论采集 可采子评论

下载&#xff1a;【1】https://drive.uc.cn/s/5257861b109b4?public1 【2】https://pan.quark.cn/s/e54155575698

python pip更换(切换)国内镜像源

国内镜像源列表(个人推荐清华大学的源) ​ 清华大学&#xff1a; https://pypi.tuna.tsinghua.edu.cn/simple阿里云&#xff1a; http://mirrors.aliyun.com/pypi/simple豆瓣&#xff1a; http://pypi.douban.com/simple中国科技大学&#xff1a; https://pypi.mirrors.ustc.e…

Linux 重启命令全解析:深入理解与应用指南

Linux 重启命令全解析&#xff1a;深入理解与应用指南 在 Linux 系统中&#xff0c;掌握正确的重启命令是确保系统稳定运行和进行必要维护的关键技能。本文将深入解析 Linux 中常见的重启命令&#xff0c;包括功能、用法、适用场景及注意事项。 一、reboot 命令 功能简介 re…

福鼎自闭症全托干预:为福鼎地区自闭症患者提供个性化教育

在探讨自闭症儿童的教育与干预时&#xff0c;个性化与全面关怀成为了不可忽视的关键词。福鼎地区的自闭症全托干预项目&#xff0c;以其对患儿个体差异的深刻理解与尊重&#xff0c;为自闭症患者提供了量身定制的支持。而在遥远的广州&#xff0c;星贝育园自闭症儿童寄宿制学校…

js基础入门篇

1.输出语句&#xff0c;内部样式&#xff0c;外部样式&#xff0c;数组定义 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…

Oracle OCP认证考试考点详解082系列01

题记&#xff1a; 本篇博文是Oracle OCP认证考试考点详解082系列的第一篇&#xff0c;本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 1. 第一题&#xff1a; 1. 题目 2. 解析及答案 关于Oracle数据库中节…

numpy——索引切片

一、索引和切片 import numpy as npx np.arange(48).reshape(6, 8) print(x)# 选取第二行 print(x[1]) #从0开始&#xff0c;取得第2行# 选取第二行, 第二列 print(x[1][1])# 选取第三行到最后一行, 第一列到最后一列 print(x[2:,2:])# 花式索引 (1, 1) 和 (4, 4) print(&quo…

.NET 8 中的 Mini WebApi

介绍 .NET 8 中的极简 API 隆重登场&#xff0c;重新定义了我们构建 Web 服务的方式。如果您想知道极简 API 的工作原理以及它们如何简化您的开发流程&#xff0c;让我们通过一些引人入胜的示例来深入了解一下。 .NET 极简主义的诞生 想想我们曾经不得不为一个简单的 Web 服务…

【在Linux世界中追寻伟大的One Piece】Socket编程UDP(续)

目录 1 -> V3版本-实现简单聊天室 1 -> V3版本-实现简单聊天室 UdpServer.hpp #pragma once#include <iostream> #include <string> #include <cerrno> #include <cstring> #include <unistd.h> #include <strings.h> #include &…

XHCI 1.2b 规范摘要(六)

系列文章目录 XHCI 1.2b 规范摘要&#xff08;一&#xff09; XHCI 1.2b 规范摘要&#xff08;二&#xff09; XHCI 1.2b 规范摘要&#xff08;三&#xff09; XHCI 1.2b 规范摘要&#xff08;四&#xff09; XHCI 1.2b 规范摘要&#xff08;五&#xff09; XHCI 1.2b 规范摘要…

Anki插件Export deck to html的改造

在Anki中进行复习时&#xff0c;每次只能打开一条笔记。如果积累了很多笔记&#xff0c;有时候会有将它们集中输出成一个pdf进行阅读的想法。Anki插件Export deck to html&#xff08;安装ID&#xff1a;1897277426&#xff09;就有这个功能。但是&#xff0c;这个插件目前存在…

哈希表——unordered_set和unordered_map的封装

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 在本章关于哈希表的设计在这里就随便提一点不再过多的讲解&#xff0c;而把重点放在封装部分。 目录 一、哈希表的设计 1.模板参数的设计 二、迭代器封装 1.迭代器简单…

理解计算机系统_异常控制流(一):异常

前言 以<深入理解计算机系统>(以下称“本书”)内容为基础&#xff0c;对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 异常控制流这章实际上是操作系统的一部分.操作系统简单的…

驱动学习(三)符号导出

1.什么是符号&#xff1f; 主要是指全局变量和函数 2.为什么要导出符号&#xff1f; ​ linux内核采用的是模块化的形式管理内核代码。内核中每个模块之间是相互独立的&#xff0c;也就是说A模块的全局变量和函数&#xff0c;B模块是无法访问的。若B模块想要使用A模块中的已有…

python爬虫——Selenium的基本使用

目录 一、Selenium的介绍 二、环境准备 1.安装Selenium 2.安装WebDriver 三、元素定位 1.常用定位元素的方法 2. 通过指定方式定位元素 四、窗口操作 1.最大化浏览器窗口 2.设置浏览器窗口大小 3.切换窗口或标签页 切换回主窗口 4. 关闭窗口 关闭当前窗口 关闭所…

java_方法重载、可变参数、作用域

方法重载 基本介绍 java 中允许同一个类中&#xff0c;多个同名方法的存在&#xff0c;但要求 形参列表不一致&#xff01; 比如&#xff1a;System.out.println(); out 是 PrintStream 类型 重载的好处 减轻了起名的麻烦减轻了记名的麻烦 案例 public class OverLoad01 …

SCI一区级 | Matlab实现SSA-TCN-LSTM-Attention多变量时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.基于SSA-TCN-LSTM-Attention麻雀搜索算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测&#xff0c;要求Matlab2023版以上&#xff0c;自注意力机制&#xff0c;一键单头注意力机制替换成多头注…