spdlog的讲解以及二次封装

高性能,超快书,零配置的日志库 总之效率很快的一个日志库

日志等级功能:

namespace level {
 enum level_enum : int {
 trace = SPDLOG_LEVEL_TRACE,
 debug = SPDLOG_LEVEL_DEBUG,
 info = SPDLOG_LEVEL_INFO,
 warn = SPDLOG_LEVEL_WARN,
 err = SPDLOG_LEVEL_ERROR,
 critical = SPDLOG_LEVEL_CRITICAL,
 off = SPDLOG_LEVEL_OFF,
 n_levels
 };
}

日志输出格式

logger->set_pattern("%Y-%m-%d %H:%M:%S [%t] [%-7l] %v");
%t - 线程 ID(Thread ID)。
%n - 日志器名称(Logger name)。
%l - 日志级别名称(Level name),如 INFO, DEBUG, ERROR 等。
%v - 日志内容(message)
%Y - 年(Year)。
%m - 月(Month)。
%d - 日(Day)。
%H - 小时(24-hour format)。
%M - 分钟(Minute)。
%S - 秒(Second)。

头文件

动态库连接 -lfmt -lspdlog

使用步骤

1.设置全局的刷新策越

//日志刷新策略-每隔 N 秒刷新一次
void flush_every(std::chrono::seconds(1))
//日志刷新策略-触发指定等级立即刷新 只输出Debug等级以上的消息
void flush_on(level::level_enum::Debug);

2.设置全局的日志等级

void set_level(level::level_enum::Debug);

3.创建对应的日志

auto loger =
spdlog::stdout_color_mt("TestLog");
//

4.设置日志的刷新策略,设置日志的日志等级

//日志刷新策略-每隔 N 秒刷新一次
//loger->flush_every(std::chrono::seconds(1))
//日志刷新策略-触发指定等级立即刷新 只输出Debug等级以上的消息
//loger->flush_on(level::level_enum::Debug);
//我们在全局中已经设置了,当日志没有设置时,会默认用全局的设置

5.编辑日志格式

loger->set_pattern("[%n] %Y-%m-%d %H:%M:%S [%t] [%-7l] %v");
%t - 线程 ID(Thread ID)。
%n - 日志器名称(Logger name)。
%l - 日志级别名称(Level name),如 INFO, DEBUG, ERROR 等。
%v - 日志内容(message
比特就业课
)。
%Y - 年(Year)。
%m - 月(Month)。
%d - 日(Day)。
%H - 小时(24-hour format)。
%M - 分钟(Minute)。
%S - 秒(Second)。

6.日志内容

logger->trace("This is a trace message");
logger->debug("This is a debug message");
logger->info("This is an info message");
logger->warn("This is a warning message");
logger->error("This is an error message");
logger->critical("This is a critical message")

如何查看源码

stdout_color_mt 向屏幕打印的日志 默认的工厂就是同步

basic_logger_mt 文件日志

auto logger=spdlog::basic_logger_mt("日志名称file.log","生成的文件名sync.log")

异步日志 由异步工厂生成

指定创建异步的日志

默认日志

文件日志

结果

异步默认日志

spdlog的二次封装

原因

1.避免单利锁的冲突,创建全局的线程安全的日志

2.spdlog没有出错的文件名以及行数

3.封装一个初始化接口,调试模式则输入到标准输出,否则输出个文件中

思路

a.封装一个初始化接口,对日志进行创建与初始化

b.对日志输出的接口,进行宏的封装,加上文件名行号

format​​ 参数的作用类似于 printf​​ 的格式化字符串

##__VA_ARGS__## 是预处理器中的“吞咽”操作符,当没有额外参数传递时,它可以安全地移除多余的逗号。

例如:LOG_TRACE("这是一个简单的日志消息");

宏展开:g_default_logger->trace(std::string("[{}:{}] 这是一个简单的日志消息"), __FILE__, __LINE__, );

## 后

g_default_logger->trace(std::string("[{}:{}] 这是一个简单的日志消息"), __FILE__, __LINE__);

​__VA_ARGS__​​ 是一个预处理器宏,用于表示变长参数列表中的所有参数

,__FILE__指明日志在哪个文件打印

__LINE_指明在文件那一行打印,方便追踪

#pragma once
#include <spdlog/spdlog.h>
#include <iostream>
#include <spdlog/logger.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>
#include <memory>
std::shared_ptr<spdlog::logger> g_default_logger;

void init_logger(bool mode,std::string &filename,int level)
{
    if(!mode)
    {
        g_default_logger=spdlog::stderr_color_mt("defalut_logger");
        g_default_logger->set_level(spdlog::level::level_enum::trace);
        g_default_logger->flush_on(spdlog::level::level_enum::trace);

    }
    else
    {
        g_default_logger=spdlog::basic_logger_mt("file_logger",filename);
        g_default_logger->set_level((spdlog::level::level_enum)level);
        g_default_logger->flush_on((spdlog::level::level_enum)level);
    }
    g_default_logger->set_pattern("[%n] %Y-%m-%d %H:%M:%S [%t] [%-8l] %v");

}
#define LOG_TRACE(format,...) g_default_logger->trace(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define LOG_DEBUG(format,...) g_default_logger->debug(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define LOG_INFO(format,...) g_default_logger->info(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define LOG_WARN(format,...) g_default_logger->warn(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define LOG_ERROR(format,...) g_default_logger->error(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define LOG_FATAL(format,...) g_default_logger->critical(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值