最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中spdlog的簡單使用示例

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

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

引用源碼

先下載spdlog的源碼,將源碼的include文件夾復制到自己的項目文件夾下:

然后在項目屬性中包含include目錄,如下圖所示:

封裝Log頭文件

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

  • 可以隨時替換后臺日志實現(xiàn)
  • 對外只用暴露一個頭文件

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個項目和1個后臺線程的隊列
    spdlog::init_thread_pool(8192, 1);
    //標準控制臺輸出
    auto stdout_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt >();
    stdout_sink->set_level(spdlog::level::debug);
    //日志文件輸出,0點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());
            //日志時間
            std::time_t now_c = std::chrono::system_clock::to_time_t(msg.time);
            //回調(diào)的處理邏輯自己根據(jù)項目情況定義,比如實時顯示到UI、保存到數(shù)據(jù)庫等等
            //.... 回調(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);
    //設置日志記錄級別,您需要用 %^ 和 %$  括上想要彩色的部分
    log->set_level(spdlog::level::trace);
    //設置格式
    //參考 https://github.com/gabime/spdlog/wiki/3.-Custom-formatting
    //[%Y-%m-%d %H:%M:%S.%e] 時間
    //[%l] 日志級別
    //[%t] 線程
    //[%s] 文件
    //[%#] 行號
    //[%!] 函數(shù)
    //[%v] 實際文本
    log->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %^[%l]%$ [%t] [%s %!:%#] %v");
    //設置當出發(fā) err 或更嚴重的錯誤時立刻刷新日志到  disk
    log->flush_on(spdlog::level::err);
    //3秒刷新一次隊列
    spdlog::flush_every(std::chrono::seconds(3));
    spdlog::set_default_logger(log);
}
//單個日志記錄器
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");
        //記錄器是自動注冊的,不需要手動注冊  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__)
//單個日志文件
#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__)
//時間統(tǒng)計宏
#define LOGSW() spdlog::stopwatch()

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

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

使用方法

使用方法如下:

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

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

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

相關(guān)文章

  • C語言菜鳥基礎教程之a(chǎn)++與++a

    C語言菜鳥基礎教程之a(chǎn)++與++a

    很多同學在學習c語言的時候是不是會碰到a++和++a都有甚么作用啊。今天我們就來探討下
    2017-10-10
  • c++虛函數(shù)及常見問題匯總

    c++虛函數(shù)及常見問題匯總

    文章詳細介紹了面向?qū)ο缶幊讨械乃拇蠡咎匦裕悍庋b、抽象、繼承和多態(tài),重點解釋了多態(tài)的概念及其在C++中的實現(xiàn)方式,包括虛函數(shù)、虛函數(shù)表、單繼承、多繼承以及純虛函數(shù)的使用,通過代碼示例展示了多態(tài)在不同情況下的表現(xiàn),以及純虛函數(shù)的約束作用,感興趣的朋友一起看看吧
    2025-12-12
  • C++ 復制控制之復制構(gòu)造函數(shù)的實現(xiàn)

    C++ 復制控制之復制構(gòu)造函數(shù)的實現(xiàn)

    所謂的“復制控制”即通過這三個成員函數(shù)控制對象復制的過程,本文主要介紹了C++ 復制控制之復制構(gòu)造函數(shù)的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • C語言解決青蛙跳臺階問題(升級版)

    C語言解決青蛙跳臺階問題(升級版)

    所謂的青蛙跳臺階問題,就是指一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。本文將用C語言解決這一問題,需要的可以參考一下
    2022-01-01
  • 淺談C語言中的注釋風格小結(jié)

    淺談C語言中的注釋風格小結(jié)

    今天小編就為大家分享一篇淺談C語言中的注釋風格小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • c++11?實現(xiàn)枚舉值到枚舉名的轉(zhuǎn)換問題

    c++11?實現(xiàn)枚舉值到枚舉名的轉(zhuǎn)換問題

    這篇文章主要介紹了c++11?實現(xiàn)枚舉值到枚舉名的轉(zhuǎn)換,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C++中測試程序運行時間的幾種方法總結(jié)

    C++中測試程序運行時間的幾種方法總結(jié)

    本文介紹了C++中測量程序運行時間的幾種方法,包括使用GetTickCount()、clock()、Boost庫的timer類以及高精度時控函數(shù)QueryPerformanceFrequency和QueryPerformanceCounter,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-09-09
  • C語言修煉之路一朝函數(shù)思習得?模塊思維世間生下篇

    C語言修煉之路一朝函數(shù)思習得?模塊思維世間生下篇

    函數(shù)是一組一起執(zhí)行一個任務的語句。每個?C?程序都至少有一個函數(shù),即主函數(shù)?main()?,所有簡單的程序都可以定義其他額外的函數(shù)
    2022-03-03
  • MySQL系列教程之使用C語言來連接數(shù)據(jù)庫

    MySQL系列教程之使用C語言來連接數(shù)據(jù)庫

    c語言操作Mysql數(shù)據(jù)庫,主要就是為了實現(xiàn)對數(shù)據(jù)庫的增、刪、改、查等操作,下面這篇文章主要給大家介紹了關(guān)于MySQL系列教程之使用C語言來連接數(shù)據(jù)庫的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • C語言中關(guān)于動態(tài)內(nèi)存分配的詳解

    C語言中關(guān)于動態(tài)內(nèi)存分配的詳解

    動態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存。棧上分配的內(nèi)存是由系統(tǒng)分配和釋放的,空間有限,在復合語句或函數(shù)運行結(jié)束后就會被系統(tǒng)自動釋放而堆上分配的內(nèi)存則不會有這個問題。
    2021-09-09

最新評論

垫江县| 尼玛县| 江阴市| 增城市| 寻乌县| 廊坊市| 邮箱| 宜都市| 湟源县| 易门县| 天台县| 衡山县| 霍城县| 连南| 茂名市| 昭平县| 台南市| 九江县| 高要市| 烟台市| 衡南县| 南通市| 南开区| 囊谦县| 阳朔县| 萨嘎县| 南溪县| 广饶县| 鸡西市| 德阳市| 姜堰市| 定西市| 舞阳县| 航空| 滨州市| 历史| 区。| 九江市| 黎城县| 葵青区| 兴化市|