亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++中spdlog的簡(jiǎn)單使用示例

 更新時(shí)間:2023年08月27日 09:03:41   作者:二次元攻城獅  
spdlog是一個(gè)開(kāi)源、跨平臺(tái)、無(wú)依賴、只有頭文件的C++11日志庫(kù),所以這篇文章主要來(lái)和大家介紹一下一個(gè)簡(jiǎn)單的spdlog使用示例,感興趣的小伙伴可以了解一下

spdlog是一個(gè)開(kāi)源、跨平臺(tái)、無(wú)依賴、只有頭文件的C++11日志庫(kù),網(wǎng)上介紹的文章有很多這里就不過(guò)多的介紹了,GitHub鏈接:https://github.com/gabime/spdlog

引用源碼

先下載spdlog的源碼,將源碼的include文件夾復(fù)制到自己的項(xiàng)目文件夾下:

然后在項(xiàng)目屬性中包含include目錄,如下圖所示:

封裝Log頭文件

一般的項(xiàng)目對(duì)日志要求都不高,主要是要求日志線程安全、異步寫(xiě)入文件、每天生成新日志、支持日志回調(diào)顯示,spdlog稍微配置一下即可。
把spdlog相關(guān)的配置全放到Log.h文件中,封裝成Log頭文件有兩個(gè)好處:

  • 可以隨時(shí)替換后臺(tái)日志實(shí)現(xiàn)
  • 對(duì)外只用暴露一個(gè)頭文件

Log頭文件的代碼如下:

#pragma once
#include "spdlog/spdlog.h"
#include "spdlog/async.h"
#include "spdlog/sinks/daily_file_sink.h"
#include "spdlog/stopwatch.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/callback_sink.h"
#include <iostream>
void init_spdlog()
{
    //異步日志,具有8k個(gè)項(xiàng)目和1個(gè)后臺(tái)線程的隊(duì)列
    spdlog::init_thread_pool(8192, 1);
    //標(biāo)準(zhǔn)控制臺(tái)輸出
    auto stdout_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt >();
    stdout_sink->set_level(spdlog::level::debug);
    //日志文件輸出,0點(diǎn)0分創(chuàng)建新日志
    auto file_sink = std::make_shared<spdlog::sinks::daily_file_sink_mt>("logs/log.txt", 0, 0);
    file_sink->set_level(spdlog::level::info);
    //日志回調(diào)
    auto callback_sink = std::make_shared<spdlog::sinks::callback_sink_mt>([](const spdlog::details::log_msg& msg)
        {
            //日志記錄器名稱
            std::string name(msg.logger_name.data(), 0, msg.logger_name.size());
            //日志消息
            std::string str(msg.payload.data(), 0, msg.payload.size());
            //日志時(shí)間
            std::time_t now_c = std::chrono::system_clock::to_time_t(msg.time);
            //回調(diào)的處理邏輯自己根據(jù)項(xiàng)目情況定義,比如實(shí)時(shí)顯示到UI、保存到數(shù)據(jù)庫(kù)等等
            //.... 回調(diào)處理邏輯的示例
            //std::tm localTime;
            //localtime_s(&localTime, &now_c);
            //char timeStr[50];
            //std::strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", &localTime);
            //// 獲取毫秒數(shù)
            //auto duration = msg.time.time_since_epoch();
            //auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count() % 1000;
            //std::cout << timeStr << "." << std::setfill('0') << std::setw(3) << milliseconds << " " ;
            //std::cout << to_string_view(msg.level).data() << " " << str << std::endl << std::endl << std::flush;
        });
    callback_sink->set_level(spdlog::level::info);
    std::vector<spdlog::sink_ptr> sinks{ stdout_sink, file_sink,callback_sink };
    auto log = std::make_shared<spdlog::async_logger>("logger", sinks.begin(), sinks.end(), spdlog::thread_pool(), spdlog::async_overflow_policy::block);
    //設(shè)置日志記錄級(jí)別,您需要用 %^ 和 %$  括上想要彩色的部分
    log->set_level(spdlog::level::trace);
    //設(shè)置格式
    //參考 https://github.com/gabime/spdlog/wiki/3.-Custom-formatting
    //[%Y-%m-%d %H:%M:%S.%e] 時(shí)間
    //[%l] 日志級(jí)別
    //[%t] 線程
    //[%s] 文件
    //[%#] 行號(hào)
    //[%!] 函數(shù)
    //[%v] 實(shí)際文本
    log->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %^[%l]%$ [%t] [%s %!:%#] %v");
    //設(shè)置當(dāng)出發(fā) err 或更嚴(yán)重的錯(cuò)誤時(shí)立刻刷新日志到  disk
    log->flush_on(spdlog::level::err);
    //3秒刷新一次隊(duì)列
    spdlog::flush_every(std::chrono::seconds(3));
    spdlog::set_default_logger(log);
}
//單個(gè)日志記錄器
std::shared_ptr<spdlog::logger>  get_async_file_logger(std::string name)
{
    auto log = spdlog::get(name);
    if (!log)
    {
        //指針為空,則創(chuàng)建日志記錄器,
        log = spdlog::daily_logger_mt<spdlog::async_factory>(name, "logs/" + name + "/log.txt");
        log->set_level(spdlog::level::trace);
        log->flush_on(spdlog::level::err);
        log->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %^[%l]%$ [%t] [%s %!:%#] %v");
        //記錄器是自動(dòng)注冊(cè)的,不需要手動(dòng)注冊(cè)  spdlog::register_logger(name);
    }
    return log;
}
#define INITLOG()     init_spdlog()
#define TRACE(...)     SPDLOG_TRACE(__VA_ARGS__)
#define DEBUG(...)     SPDLOG_DEBUG(__VA_ARGS__)
#define INFO(...)      SPDLOG_INFO(__VA_ARGS__)
#define WARN(...)      SPDLOG_WARN(__VA_ARGS__)
#define ERROR(...)     SPDLOG_ERROR(__VA_ARGS__)
#define CRITICAL(...)  SPDLOG_CRITICAL(__VA_ARGS__)
//單個(gè)日志文件
#define GETLOG(LOG_NAME) get_async_file_logger(LOG_NAME)
#define LOGGER_TRACE(logger,...)     SPDLOG_LOGGER_TRACE(logger,__VA_ARGS__)
#define LOGGER_DEBUG(logger,...)     SPDLOG_LOGGER_DEBUG(logger,__VA_ARGS__)
#define LOGGER_INFO(logger,...)      SPDLOG_LOGGER_INFO(logger,__VA_ARGS__)
#define LOGGER_WARN(logger,...)      SPDLOG_LOGGER_WARN(logger,__VA_ARGS__)
#define LOGGER_ERROR(logger,...)     SPDLOG_LOGGER_ERROR(logger,__VA_ARGS__)
#define LOGGER_CRITICAL(logger,...)  SPDLOG_LOGGER_CRITICAL(logger,__VA_ARGS__)
//時(shí)間統(tǒng)計(jì)宏
#define LOGSW() spdlog::stopwatch()

上面的代碼是用于初始化和配置spdlog庫(kù)的日志記錄器的代碼。主要包括以下幾個(gè)部分:

  • init_spdlog()函數(shù)用于初始化spdlog庫(kù)的配置。該函數(shù)創(chuàng)建了一個(gè)包含控制臺(tái)、文件和回調(diào)三種sink的日志記錄器,并設(shè)置將其設(shè)置為默認(rèn)記錄器。
  • get_async_file_logger()函數(shù)獲取一個(gè)單獨(dú)的異步文件日志記錄器,主要用于記錄多線程日志,一般情況下用的比較少。
  • 用于簡(jiǎn)化日志記錄的操作一些宏,spdlog自帶的有日志宏,這里只是簡(jiǎn)化一下并做隔離,實(shí)際上是對(duì)spdlog庫(kù)的相應(yīng)函數(shù)進(jìn)行了封裝。
  • 定義了一個(gè)LOGSW()宏,用于方便地創(chuàng)建一個(gè)時(shí)間統(tǒng)計(jì)器,使用時(shí)不需要過(guò)多的關(guān)注統(tǒng)計(jì)類本身。

使用方法

使用方法如下:

#include "Log.h"
#include <thread>
#include <chrono>
#include <iostream>
int main()
{
    INITLOG("path");
    //單個(gè)日志
    auto log1= GETLOG("Test1");
    auto log2= GETLOG("Test1");
    //原始調(diào)用方式
    //SPDLOG_LOGGER_INFO(log1, "123");
    LOGGER_INFO(log2, "123");
    auto sw = LOGSW();
    // 延時(shí)2秒
    std::this_thread::sleep_for(std::chrono::seconds(2)); 
    INFO("Elapsed {0} {1}","時(shí)間", sw);
    WARN("Elapsed {0} {1}", "時(shí)間", sw);
    //原始調(diào)用方式
    //SPDLOG_INFO("TEST");
    INFO("TEST");
}

最后生成的日志文件如下:

到此這篇關(guān)于C++中spdlog的簡(jiǎn)單使用示例的文章就介紹到這了,更多相關(guān)C++ spdlog內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pcl1.8.0+vs2013環(huán)境配置超詳細(xì)教程

    pcl1.8.0+vs2013環(huán)境配置超詳細(xì)教程

    這篇文章主要介紹了pcl1.8.0+vs2013環(huán)境配置超詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • 基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的走迷宮游戲

    基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的走迷宮游戲

    這篇文章主要介紹了基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的走迷宮游戲,用到雙向隊(duì)列,方便在運(yùn)行完畢后輸出經(jīng)過(guò)的點(diǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • OpenCV實(shí)現(xiàn)繞圖片中任意角度旋轉(zhuǎn)任意角度

    OpenCV實(shí)現(xiàn)繞圖片中任意角度旋轉(zhuǎn)任意角度

    這篇文章主要為大家詳細(xì)介紹了在圖片不被裁剪時(shí),opencv如何實(shí)現(xiàn)繞圖片中任意點(diǎn)旋轉(zhuǎn)任意角度,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-09-09
  • C語(yǔ)言解決百錢買百雞問(wèn)題

    C語(yǔ)言解決百錢買百雞問(wèn)題

    本文給大家分享的是一個(gè)經(jīng)典的算法(百元百雞)的C語(yǔ)言版的解決方法,使用的是比較偷懶的窮舉法,有需要的小伙伴可以參考下。
    2016-02-02
  • C++結(jié)構(gòu)體與類指針知識(shí)點(diǎn)總結(jié)

    C++結(jié)構(gòu)體與類指針知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理了關(guān)于C++結(jié)構(gòu)體與類指針知識(shí)點(diǎn)以及相關(guān)內(nèi)容,有興趣的朋友們參考學(xué)習(xí)下。
    2019-09-09
  • c語(yǔ)言中用字符串?dāng)?shù)組顯示菜單的解決方法

    c語(yǔ)言中用字符串?dāng)?shù)組顯示菜單的解決方法

    本篇文章是對(duì)c語(yǔ)言中用字符串?dāng)?shù)組顯示菜單的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++設(shè)計(jì)模式之CRTP的使用

    C++設(shè)計(jì)模式之CRTP的使用

    CRTP全稱是curious?recurring?template?pattern,即奇異遞歸模版模式,是一種c++的設(shè)計(jì)模式,精巧地結(jié)合了繼承和模板編程的技術(shù),下面就跟隨小編一起來(lái)學(xué)習(xí)一下CRTP的使用吧
    2023-10-10
  • C++ 二維(多維)vector添加一個(gè)空項(xiàng)問(wèn)題

    C++ 二維(多維)vector添加一個(gè)空項(xiàng)問(wèn)題

    這篇文章主要介紹了C++ 二維(多維)vector添加一個(gè)空項(xiàng)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 淺談C++內(nèi)存管理基礎(chǔ)知識(shí)

    淺談C++內(nèi)存管理基礎(chǔ)知識(shí)

    這篇文章主要為大家介紹了C++的內(nèi)存管理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • xxx_cast類型轉(zhuǎn)換的實(shí)現(xiàn)方法

    xxx_cast類型轉(zhuǎn)換的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇xxx_cast類型轉(zhuǎn)換的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12

最新評(píng)論