目錄
介紹
二次封裝
介紹
???????? spdlog 是C++開源的第三方日志庫,整個項目在 spdlog 命名空間中。
????????在 spdlog 命名空間的?level 命名空間里定義了枚舉類型,把日志分為了 5 個等級:trace??debug? ?info? ?warn? err? ?critical
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};
? ? ? ? spdlog::logger 類是基類(是整個項目其他日志類的基類)。spdlog::spdlog::async_logger 類是異步日志類。不過我們用該項目的時候不直接使用類實例化對象,而是用工廠類幫我們實例化對象。
? ? ? ? 那么我們現在只需認識?spdlog::logger 類的幾個接口即可
//設置日志輸出最低等級,參數為 spdlog::level::level_enumvoid set_level();//以什么等級輸出日志,參數為要輸出的內容(字符串)void trace()void debug()void info()void warn()void error()void critical()
在 spdlog 項目中,占位符用 {}
幾個重要的全局接口
//輸出等級設置接口
void set_level(level::level_enum log_level);
//日志刷新策略-每隔 N 秒刷新一次
void flush_every(std::chrono::seconds interval)
//日志刷新策略-觸發指定等級立即刷新
void flush_on(level::level_enum log_level);
工廠類的接口就不介紹了,可以到項目源碼的下面查看,作者給出了很多詳細示例。工廠類的返回值為?std::shared_ptr<spdlog::logger>?,也就是智能指針指向基類,用智能指針管理日志類資源。
GitHub - gabime/spdlog: Fast C++ logging library.
二次封裝
代碼如下
#include <spdlog/spdlog.h>
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/async.h"
#include "spdlog/sinks/basic_file_sink.h"
#include <chrono> //C++ 標準庫namespace LOG
{std::shared_ptr<spdlog::logger> log_ptr;bool init_logger_ok = false;//mode 為 true 表示在調試模式下輸出日志,trace 等級以上的日志全部輸出,且輸出到顯示器上,否則就是在發布模式下輸出日志,只會輸出 level 及以上等級的日志//interval 表示多少毫秒刷新一次日志//flie_path 表示發布模式下,異步日志刷新到哪個文件里void init_logger( bool mode = true, int interval = 1000, spdlog::level::level_enum level = spdlog::level::level_enum::trace, std::string flie_path = "test.log"){//間隔多長時間刷新一次spdlog::flush_every(std::chrono::duration<double, std::ratio<1, 1000>>(interval));//觸發指定等級立即刷新spdlog::flush_on(spdlog::level::level_enum::err);spdlog::flush_on(spdlog::level::level_enum::critical);if(true == mode){//在調試模式下輸出日志log_ptr = spdlog::stderr_color_mt("stdout_logger");log_ptr->set_level(level); }else{//在運行模式下,采用異步日志的方式log_ptr = spdlog::basic_logger_mt<spdlog::async_factory>("async_logger", flie_path);log_ptr->set_level(level);}//設置輸出格式log_ptr->set_pattern("%H:%M:%S [%n][%-7l]%v");init_logger_ok = true;}#define LOG_DEBUG(format, ...) false == LOG::init_logger_ok ? throw "未初始化日志" : LOG::log_ptr->debug(std::string("[{:>10s}:{:<4d}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)#define LOG_INFO(format, ...) false == LOG::init_logger_ok ? throw "未初始化日志" : LOG::log_ptr->info(std::string("[{:>10s}:{:<4d}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)#define LOG_WARN(format, ...) false == LOG::init_logger_ok ? throw "未初始化日志" : LOG::log_ptr->warn(std::string("[{:>10s}:{:<4d}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)#define LOG_ERROR(format, ...) false == LOG::init_logger_ok ? throw "未初始化日志" : LOG::log_ptr->error(std::string("[{:>10s}:{:<4d}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)
}
? ? ? ? 用 LOG::init_logger 初始化日志類,可以選擇兩種模式:
? ? ? ? 調試模式:同步的方式輸出日志,最低日志等級為?trace 。
? ? ? ? 發布模式:異步方式輸出日志,最低輸出日志等級自己決定。
????????std::chrono::duration<double, std::ratio<1, 1000>> 表示間隔多少個 1 / 1000 秒。
? ? ? ? 常見的輸出格式如下:
%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)。 |
在使用時要鏈接兩個庫,makefile 如下示例
main : main.ccg++ -std=c++17 $^ -o $@ -lspdlog -lfmt