spdlog框架的安装与使用

spdlog的安装

sudo apt-get install libspdlog-dev

spdlog的使用

同步日志器sync.cc
(输出到显示器/输出到指定文件)

#include<spdlog/spdlog.h>
#include<spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>
#include<iostream>

int main()
{
    //设置全局的刷新策略,每秒刷新一次
    spdlog::flush_every(std::chrono::seconds(1));
    //遇到debug以上级别的日志立刻刷新
    spdlog::flush_on(spdlog::level::level_enum::debug);
    //设置全局的日志输出等级
    spdlog::set_level(spdlog::level::level_enum::debug);

    //创建同步日志器(模板默认是同步工厂,不需要写,标准输出,输出到显示器上)
    //auto logger=spdlog::stdout_color_mt("defaut-logger");
    //创建同步日志器(文件输出,输出到文件上)
    auto logger=spdlog::basic_logger_mt("file-logger","sync_file.log");
    //设置日志器的刷新策略,以及输出等级,但是已经有了全局的就可以不用局部的
    // logger->flush_on(spdlog::level::level_enum::debug);
    // logger->set_level(spdlog::level::level_enum::debug);
    
    //设置日志的输出格式、
    logger->set_pattern("[%H:%M:%S][%t][%n][%-8l] %v");
    //进行简单的日志输出
    logger->trace("你好!{}","陶恩威");
    logger->debug("你好!{}","陶恩威");
    logger->info("你好!{}","陶恩威");
    logger->warn("你好!{}","陶恩威");
    logger->error("你好!{}","陶恩威");
    logger->critical("你好!{}","陶恩威");
    std::cout<<"日志输出完毕\n";
    return 0;
}

makefile:

sync:sync.cc
	g++ -std=c++17 $^ -o $@ -lspdlog -lpthread

异步日志器:async.cc
(输出到显示器/输出到指定文件)

#include<spdlog/spdlog.h>
#include<spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>
#include<spdlog/async.h>
#include<iostream>
//异步日志器跟同步日志器的使用没有区别,只不过在创建时,需要使用异步工厂日志器模板
int main()
{
    //设置全局的刷新策略,每秒刷新一次
    spdlog::flush_every(std::chrono::seconds(1));
    //遇到debug以上级别的日志立刻刷新
    spdlog::flush_on(spdlog::level::level_enum::debug);
    //设置全局的日志输出等级
    spdlog::set_level(spdlog::level::level_enum::debug);

    //创建异步日志器(模板默认是同步工厂,创建异步就需要指定异步工厂,标准输出,输出到显示器上),会将后面的先输出
    //而原本的日志输出后输出,因为日志先放入了内存中,由线程池输出
    //auto logger=spdlog::stdout_color_mt<spdlog::async_factory>("defaut-logger");
    //异步日志器,文件输出
    auto logger=spdlog::basic_logger_mt<spdlog::async_factory>("file-logger","async_file.log");
    //设置日志的输出格式、
    logger->set_pattern("[%H:%M:%S][%t][%n][%-8l] %v");
    //进行简单的日志输出
    logger->trace("你好!{}","陶恩威");
    logger->debug("你好!{}","陶恩威");
    logger->info("你好!{}","陶恩威");
    logger->warn("你好!{}","陶恩威");
    logger->error("你好!{}","陶恩威");
    logger->critical("你好!{}","陶恩威");
    std::cout<<"日志输出完毕\n";
    return 0;
}

makefile:

async:async.cc
	g++ -std=c++17 $^ -o $@ -lspdlog -lpthread

spdlog二次封装

spdlog日志输出没有文件名和行号,而一般项目中都要有对应的文件名以及行号,所以原本的spdlog就不好用,所以要封装一下,让其能够打印行号与文件名。

要对日志的初始化接口进行封装
要对日志的输出接口进行封装

logger.hpp

//对日志器进行二次封装
//1.因为原来的日志格式中没有文件名和行号,所以要进行封装
//2.为了便于操作,通过命令行参数来决定创建日志器输出在哪里:
/*如果是debug模式则输出到标准输出中.如果是发布模式则输出到文件中*/

#include<spdlog/spdlog.h>
#include<spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>
#include<spdlog/async.h>
//初始化日志器,有三个参数
//1.mode 表示运行的模式,true代表是发布模式,false代表是dubug模式
//2.file 表示如果是发布模式,日志输出的文件名叫什么,在debug模式下为空
//3.level 发布模式下,输出的日志等级是什么,在debug模式下为0.
std::shared_ptr<spdlog::logger> default_logger;
void init_logger(bool mode,const std::string&file,uint32_t level)
{
    if(mode==false)
    {
        //调试debug模式下,则创建标准输出日志器,日志器的等级最低为0,刷新策略也是最低
        default_logger=spdlog::stdout_color_mt("defaut-logger");
        default_logger->set_level(spdlog::level::level_enum::trace);
        default_logger->flush_on(spdlog::level::level_enum::trace);
    }
    else
    {
        //发布模式下,则创建文件输出日志器,日志器的等级为level,刷新策略也是level
        default_logger=spdlog::basic_logger_mt("file-logger",file);
        default_logger->set_level((spdlog::level::level_enum)level);
        default_logger->flush_on((spdlog::level::level_enum)level);
    }
    //创建完日志器之后,就要设置日志器的输出格式
    default_logger->set_pattern("[%H:%M:%S][%t][%n][%-8l]%v");
}

//日志器初始化完后,就要对日志器的输出进行封装,因为日志器的输出格式中没有文件名和行号,利用宏定义来修改
#define TRACE_LOG(format,...) default_logger->trace(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define DEBUG_LOG(format,...) default_logger->debug(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define INFO_LOG(format,...) default_logger->info(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define ERROR_LOG(format,...) default_logger->error(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define FATAL_LOG(format,...) default_logger->critical(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);

使用样例:
mian.cc


#include "logger.hpp"
#include <gflags/gflags.h>
#include<iostream>
//想通过命令行参数调整变量的内容,所以通过gflags框架捕捉命令行参数数据放入到自己定义的全局变量中
DEFINE_bool(run_mode,false,"表示程序的运行模式,默认是false调试默认,true表示发布模式");
DEFINE_string(file,"","表示发布模式下要输出的文件名称,默认调试模式下为空");
DEFINE_int32(level,0,"表示发布模式下日志器输出的等级,默认调试模式下为0");

int main(int argc,char*argv[])
{
    //首先初始化gflags框架,告诉它要捕捉命令行中的参数数据
    google::ParseCommandLineFlags(&argc, &argv, true);
    //初始化spdlog日志器;
    init_logger(FLAGS_run_mode,FLAGS_file,FLAGS_level); 
    //日志输出
    TRACE_LOG("你好呀 {}","陶恩威");
    DEBUG_LOG("你好呀 {}","陶恩威");
    INFO_LOG("你好呀 {}","陶恩威");
    ERROR_LOG("你好呀 {}","陶恩威");
    FATAL_LOG("你好呀 {}","陶恩威");
    return 0;
}

makefile:

main:main.cc
	g++ -std=c++17 $^ -o $@ -lspdlog -lpthread -lgflags

总结:

spdlog日志库封装与使用
本文介绍了spdlog日志库的安装、基本使用和二次封装方法。主要内容包括:
spdlog安装:通过apt-get install libspdlog-dev命令安装
基本使用:
同步日志器:支持输出到显示器或文件
异步日志器:使用线程池提高性能

二次封装:
封装了日志初始化接口,支持通过命令行参数控制日志输出模式(debug/发布)
封装了日志输出宏,添加了文件名和行号信息
使用gflags框架处理命令行参数

示例代码展示了如何初始化日志器和输出不同级别的日志信息

封装后的日志库更方便在项目中使用,能够自动记录文件名和行号,并通过命令行参数灵活控制日志行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tew_gogogo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值