spdlog讲解
介绍
spdlog 是一个高性能、超快速、零配置的 C++ 日志库,它旨在提供简洁的 API 和丰富的功能,同时保持高性能的日志记录。它支持多种输出目标、格式化选项、线程安全以及异步日志记录。
安装
sudo apt-get install libspdlog-dev
接口讲解
对于 spdlog 的设计让我想到了之前使用的 jsoncpp 序列化和反序列化,
都是基于一个基础的类,在之后设置工厂类进行创建不同的类型
日志记录器类
创建一个日志记录器,并设置日志级别和输出模式
namespace spdlog {class logger { logger(std::string name); logger(std::string name, sink_ptr single_sink) logger(std::string name, sinks_init_list sinks) void set_level(level::level_enum log_level); void set_formatter(std::unique_ptr<formatter> f); //这是几个不同等级的打印接口template<typename... Args> void trace(fmt::format_string<Args...> fmt, Args &&...args) template<typename... Args> void debug(fmt::format_string<Args...> fmt, Args &&...args) template<typename... Args> void info(fmt::format_string<Args...> fmt, Args &&...args) template<typename... Args> void warn(fmt::format_string<Args...> fmt, Args &&...args) template<typename... Args> void error(fmt::format_string<Args...> fmt, Args &&...args) template<typename... Args> void critical(fmt::format_string<Args...> fmt, Args &&...args)//两种不同的刷新策略,这里是对指定的日志类设置刷新策略void flush(); //刷新日志 //策略刷新--触发指定等级日志的时候立即刷新日志的输出 void flush_on(level::level_enum log_level);
};
异步日志器类
异步创建日志类,主要使用 spdlog::async_logger
class async_logger final : public logger
{//这里的初始化我们没必要过于关注,下面的工厂类会进行封装async_logger(std::string logger_name,sinks_init_list sinks_list,std::weak_ptr<details::thread_pool> tp,async_overflow_policy overflow_policy =async_overflow_policy::block);async_logger(std::string logger_name,sink_ptr single_sink,std::weak_ptr<details::thread_pool> tp,async_overflow_policy overflow_policy =async_overflow_policy::block);// 异步日志输出需要异步工作线程的支持,这里是线程池类class SPDLOG_API thread_pool{thread_pool(size_t q_max_items,size_t threads_n,std::function<void()> on_thread_start,std::function<void()> on_thread_stop);thread_pool(size_t q_max_items, size_t threads_n,std::function<void()> on_thread_start);thread_pool(size_t q_max_items, size_t threads_n);};
}//默认线程池的初始化接口
inline void init_thread_pool(size_t q_size, size_t thread_count)
日志记录器工厂
类的创建接口,
using async_factory =async_factory_impl<async_overflow_policy::block>;template <typename Sink, typename... SinkArgs>
inline std::shared_ptr<spdlog::logger> create_async(std::string logger_name,SinkArgs &&...sink_args)--------------------------------------------------------------------------------// 创建一个彩色输出到标准输出的日志记录器,默认工厂创建同步日志记录器template <typename Factory = spdlog::synchronous_factory>std::shared_ptr<logger> stdout_color_mt(const std::string &logger_name,color_mode mode = color_mode::automatic);-----------------------------------------------------------------------------------// 指定文件
template <typename Factory = spdlog::synchronous_factory>
std::shared_ptr<logger> basic_logger_mt(const std::string &logger_name,const filename_t &filename,bool truncate = false,const file_event_handlers &event_handlers = {})------------------------------------------------------------------------------------//默认是同步日志类,当我们想要换为异步日志类时就将<logger>换为<spd::async_logger>
日志类格式设置
相关函数
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%L%$] [%t] %v");
占位符 | 含义 | 示例输出 |
| 4 位年 |
|
| 2 位月 |
|
| 2 位日 |
|
| 24 小时 |
|
| 分钟 |
|
| 秒 |
|
| logger 名称 |
|
| 级别全称 |
|
| 实际消息文本 |
|
| 文件名:行号 |
|
代码演示
同步日志类
#include<spdlog/spdlog.h>
#include<iostream>//注意不要忘了头文件
#include <spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>int main()
{//设置全局刷新策略spdlog::flush_every(std::chrono::seconds(1));spdlog::flush_on(spdlog::level::level_enum::debug);//设置全局的日志输出等级spdlog::set_level(spdlog::level::level_enum::debug);//创建同步日志器//auto logger=spdlog::stdout_color_mt("default-logger");auto logger=spdlog::basic_logger_mt("file_logger","sync.log");//设置日志器的刷新策略和等级// logger->flush_on(spdlog::level::level_enum::debug);// logger->set_level(spdlog::level::level_enum::debug);//设置日志器的输出格式logger->set_pattern("[%H:%M:%S][%t][%-8l] %v");//spdlog的输出占位符号是{}logger->trace("你好,{}","xiaowang");logger->debug("你好 {}","xiaownag");logger->error("你好 {}","xiaownag");return 0;
}
异步日志类
#include<spdlog/spdlog.h>
#include<iostream>//注意不要忘了头文件
#include <spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>
#include<spdlog/async.h>int main()
{//设置全局刷新策略spdlog::flush_every(std::chrono::seconds(1));spdlog::flush_on(spdlog::level::level_enum::debug);//设置全局的日志输出等级spdlog::set_level(spdlog::level::level_enum::debug);//观察这里spdlog::async_factory的变化auto logger=spdlog::basic_logger_mt<spdlog::async_factory>("file_logger","async.log");//设置日志器的输出格式logger->set_pattern("[%H:%M:%S][%t][%-8l] %v");//spdlog的输出占位符号是{}logger->trace("你好,{}","xiaowang");logger->debug("你好 {}","xiaownag");logger->error("你好 {}","xiaownag");return 0;
}