spdlog框架的安裝與使用
- spdlog的安裝
- spdlog的使用
- 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.ccg++ -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.ccg++ -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,刷新策略也是leveldefault_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.ccg++ -std=c++17 $^ -o $@ -lspdlog -lpthread -lgflags
總結:
spdlog日志庫封裝與使用
本文介紹了spdlog日志庫的安裝、基本使用和二次封裝方法。主要內容包括:
spdlog安裝:通過apt-get install libspdlog-dev命令安裝
基本使用:
同步日志器:支持輸出到顯示器或文件
異步日志器:使用線程池提高性能
二次封裝:
封裝了日志初始化接口,支持通過命令行參數控制日志輸出模式(debug/發布)
封裝了日志輸出宏,添加了文件名和行號信息
使用gflags框架處理命令行參數
示例代碼展示了如何初始化日志器和輸出不同級別的日志信息
封裝后的日志庫更方便在項目中使用,能夠自動記錄文件名和行號,并通過命令行參數靈活控制日志行為。