spdlog库安装及使用

安装

git clone https://github.com/gabime/spdlog.git      

然后将./spdlog/include/spdlog拷贝到工程目录下就ok了,该库是header-only的

使用

将官方给的demo拷贝下来:

/* ************************************************************************
    2 > File Name:     test11.cpp
    3 > Author:        Qian JiLi
    4 > mail:          193937157@qq.com
    5 > Created Time:  Thu May  4 20:09:16 2023
    6 > Description:   official spdlog example
    7  ************************************************************************/
#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");
}

新建makefile文件:

all:test11 

test11:test11.cpp
	g++ -g -o ./bin/test11 test11.cpp -I./ -std=c++11

spdlog的结构

在这里插入图片描述
logger registry(日志管理器):负责管理所有的logger,用户建立的所有logger都会在registry处进行登记然后统一管理
logger(日志记录器):是用户直接操作的对象,通过操作logger进行日志逻辑的生成
sink(日志记录器槽):受logger控制,执行具体的动作(动作包括写入日志文件/输出到控制台)
在这里插入图片描述
一个logger registry管多个logger,一个logger管多个sink。logger registry中的logger是通过name进行对应的。后面使用的时候可以直接通过名称获取对应的日志对象。

常用api

设定日志级别并输出到控制台

spdlog支持一下几种级别,

trace = SPDLOG_LEVEL_TRACE // 最低级(用来记录代码执行轨迹)
debug = SPDLOG_LEVEL_DEBUG //      (用来记录debug信息)
info = SPDLOG_LEVEL_INFO   
warn = SPDLOG_LEVEL_WARN
err = SPDLOG_LEVEL_ERROR
critical = SPDLOG_LEVEL_CRITICAL
off = SPDLOG_LEVEL_OFF     // 最高级

使用spdlog::set_level设置想看到的日志级别,如:

// 只显示info及比info高级的信息,trace 和 debug 不显示
spdlog::set_level(spdlog::level::info); 

有点类似于java中的logger:

// application.properties
logging.level.com.nowcoder.mycommunity=ERROR

// LoggerTest.java
    @Test
    public void testLogger(){
        System.out.println(logger.getName());

        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
    }

测试:

#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/spdlog.h"
void stdout_example() {
  spdlog::set_level(spdlog::level::critical);
  spdlog::info("hello {}", "world");
  spdlog::critical("hello {}", "world");
}
int main() { stdout_example(); }
写日志文件
#include "spdlog/sinks/basic_file_sink.h"
void basic_log_file_example() {
  // 开启并创建本地日志
  auto my_logger =
      spdlog::basic_logger_mt("file_logger", "logs/basic-log.txt", true);
  // 设置该日志的显示级别
  my_logger->set_level(spdlog::level::warn);
  // 向该日志中写入信息
  my_logger->info("Hello, {}!", "World");
  my_logger->warn("Hello, {}!", "World");
}

#include "spdlog/sinks/daily_file_sink.h"
void daliy_log_file_example() {
  // 每天凌晨两点半创建新文件
  auto my_logger =
      spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30);
  // 设置该日志的显示级别
  my_logger->set_level(spdlog::level::warn);
  // 向该日志中写入信息
  my_logger->info("Hello, {}!", "World");
  my_logger->warn("Hello, {}!", "World");
}

#include "spdlog/sinks/rotating_file_sink.h"
void rotating_example()
{
    // 创建一个max_size大小的日志文件,文件最多保留3个
    auto max_size = 1024*1024 * 5;
    auto max_files = 3;
    auto logger = spdlog::rotating_logger_mt("some_logger_name", "logs/rotating.txt", max_size, max_files);
}

int main() {
  basic_log_file_example();
  daliy_log_file_example();
}
实时刷新日志
my_logger->flush_on(spdlog::level::trace);
在不同函数中调用logger
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO

#include "spdlog/spdlog.h"
#include "spdlog/sinks/rotating_file_sink.h"


void writeLog(int n) {
    for (int i = 0; i < n; ++i) {
        // 获取logger后输出日志
        auto myLogger = spdlog::get("baseLogger");
        myLogger->info("{}: Hello, {}!", i + 1, "World");
        myLogger->info("Welcome to spdlog!");
        myLogger->error("Some error message with arg: {}", 1);

        // 带文件名与行号的日志输出
        SPDLOG_LOGGER_INFO(myLogger, "Support for floats {:03.2f}", 1.23456);
        SPDLOG_LOGGER_WARN(myLogger, "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::error("Some error message with arg: {}", 1);
        spdlog::warn("Easy padding in numbers like {:08d}", 12);
        spdlog::info("Support for floats {:03.2f}", 1.23456);
    }
}

void testSPDLog() {
    // 设定日志最大100k,且最多保留10个
    auto myLogger = spdlog::rotating_logger_mt("baseLogger", "logs/basic.log", 1024 * 100, 10);
    spdlog::set_default_logger(myLogger);
    myLogger->set_pattern("[%Y-%m-%d %H:%M:%S.%e][%l](%@): %v"); // 非通过宏输出的日志%@输出为空
    myLogger->set_level(spdlog::level::info);

    myLogger->info("Hello, {}!", "World");

    writeLog(10);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值