设为首页 加入收藏

TOP

【C++】spdlog光速入门,C++logger最简单最快的库(一)
2023-07-23 13:32:38 】 浏览:83
Tags:spdlog logger 简单最

参考文档:https://spdlog.docsforge.com/master/

spdlog简介

Very fast, header only, C++ logging library.
一个header-only的C++日志库,十分高效且易用。

获取安装方式

https://github.com/gabime/spdlog
使用时只需要将git项目内的/include/spdlog文件夹整个放入项目的include目录下即可

使用样例

#include "spdlog/spdlog.h"

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");
}

快速入门

几个核心概念

  • logger:日志对象,每个日志内包含一个sink组成的vector,每个sink可以分别设置优先级,logger本身也可设置优先级
  • sink:直译是水槽,实际上是引流的对象或者可以认为是输出目标,spdlog库内置了多种不同类型的logger可供选择
  • formatter:格式化对象,绝大部分情况下spdlog默认的格式就足够用了,但是如果有个性化需求,可以进行自定义格式
  • level:日志级别,不同的日志库可能会有不同的设置,但是基本情况下都会有debug、info、warn、error等的级别划分来处理不同的情况,具体各个级别的情况可以根据自己的实际情况选取

逻辑关系:每个logger包含一个vector,该vector由一个或多个std::shared_ptr<sink>组成,logger的每条日志都会调用sink对象,由sink对象按照formatter的格式输出到sink指定的地方(有可能是控制台、文件等),接下来我们从内到外的讲解spdlog的这三个核心组件

formatter

formatter也即格式化对象,用于控制日志的输出格式,spdlog自带了默认的formatter,一般情况下,我们无需任何修改,直接使用即可。注意,每个sink会有一个formatter

默认formatter

默认formatter的格式为:[日期时间] [logger名] [log级别] log内容

[2022-10-13 17:00:55.795] [service] [debug] found env XXXXXXX : true
[2022-10-13 17:00:55.795] [func_config] [debug] kafka_brokers : localhost:9092
[2022-10-13 17:00:55.795] [func_config] [debug] kafka_main_topic : kafka_test
[2022-10-13 17:00:55.795] [func_config] [debug] kafka_partition_value : -1
[2022-10-13 17:00:55.795] [service] [info] initialized

自定义formatter

如果默认的formatter不符合需求,可以自定义formatter,具体方式如下

  • set_parrtern(pattern_string);
    • 例如:
    • 全局级别的:spdlog::set_pattern(" [%H:%M:%S %z] [thread %t] %v ");
    • 单个logger级别的:some_logger->set_parttern(">>> %H:%M:%S %z %v <<<");
    • 单个sink级别的:some_sink-> set_parttern(".. %H: %M ..");
      其中用到了%H %M这些占位符,事实上它们都是预先设定好的,想要查看所有的占位符情况,可以参考以下网站:
      https://spdlog.docsforge.com/v1.x/3.custom-formatting/#pattern-flags

sink

每个sink对应着一个输出目标和输出格式,它内部包含一个formatter,输出目标可以是控制台、文件等地方。
所有的sink都在命名空间spdlog::sinks下,可以自行探索

控制台sink

spdlog中创建控制台sink非常简单,该方式创建的sink会输出到命令行终端,且是彩色的(也可以选非彩色的,但是有彩色的应该都会选彩色的吧……)。后缀的_mt代表多线程,_st代表单线程

auto sink1 = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();

文件sink

文件sink的类型有很多,这里展示几种经典类型

auto sink1 = std::make_shared<spdlog::sinks::basic_file_sink_mt>(log_file_name);//最简单的文件sink,只需要指定文件名

auto sink2 = std::make_shared<spdlog::sinks::daily_file_sink_mt>(log_file_name, path, 14, 2
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【Visual Leak Detector】源码编.. 下一篇C++函数详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目