c++ 日誌輸出庫 spdlog 簡介(1)

來源:互聯網
上載者:User

標籤:float   內容   檔案中   padding   margin   names   http   退出   int   

參考文章:

log庫spdlog簡介及使用 - 網路資源是無限的 - CSDN部落格 http://blog.csdn.net/fengbingchun/article/details/78347105

spdLog的使用 - 煙消bug雲散的專欄 - CSDN部落格 http://blog.csdn.net/yanxiaobugyunsan/article/details/79088533

官方參考文檔: QuickStart · gabime/spdlog Wiki · GitHub

https://github.com/gabime/spdlog/wiki/1.-QuickStart


1、下載源碼

代碼地址在 https://github.com/gabime/spdlog

點擊downLoad下載即可。

2、example解析

下載壓縮包並解壓:使用visual studio 開啟vcxproj尾碼的專案檔(我用的是VS2013)

在解決方案中找到example.cpp,這個源檔案例舉了spdlog的各種用法:

首先需要包含spdlog的標頭檔

#include "spdlog/spdlog.h"

並且要聲明spdlog的命名空間

namespace spd = spdlog;

(1)控制台(console)輸出日誌

使用控制台輸出日誌的話,需要這兩個標頭檔:

#include <iostream>
#include <memory>

代碼如下:

// Console logger with color        auto console = spd::stdout_color_mt("console");        console->info("Welcome to spdlog!");        console->error("Some error message with arg{}..", 1);        // Formatting examples        console->warn("Easy padding in numbers like {:08d}", 12);        console->critical("Support for int: {0:d};  hex: {0:x};  oct: {0:o}; bin: {0:b}", 42);        console->info("Support for floats {:03.2f}", 1.23456);        console->info("Positional args are {1} {0}..", "too", "supported");        console->info("{:<30}", "left aligned");        spd::get("console")->info("loggers can be retrieved from a global registry using the spdlog::get(logger_name) function");

auto console = spd::stdout_color_mt("console"); 中“console”為logger名稱,可以隨意命名。

warn,critical,info 為不同等級的log,輸出在控制台會以不同顏色表示。

注意,logger使用完,程式關閉之前需要調用drop函數釋放logger對象,否則如果程式沒有關閉,就無法再建立同樣名稱的logger。

在example.cpp中main函數的最後調用了

// Release and close all loggers        spdlog::drop_all();

如果只想關閉console的log,可以這樣寫:

spd::drop("basic_logger");

(2)basic log

不帶滾動,記錄檔會一直被寫入,不斷變大。

// Create basic file logger (not rotated)        auto my_logger = spd::basic_logger_mt("basic_logger", "logs/basic-log.txt");        my_logger->info("Some log message");

(3)rotating log

滾動日誌,當記錄檔超出規定大小時,會刪除當前記錄檔中所有內容,重新開始寫入。

從函式宣告可以看出,參數max_file_size 規定了檔案的最大值,檔案內容超過此值就會清空。

rotating_logger_mt(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files)

參數max_files 規定了滾動檔案的個數。當logger_name存滿時,將其名稱更改為logger_name.1,再建立一個logger_name檔案來儲存新的日誌。再次存滿時,把logger_name.1改名為logger_name.2,logger_name改名為logger_name.1,建立一個logger_name來存放新的日誌。max_files 數量為幾,就可以有幾個logger_name檔案用來滾動。

下面的例子運行後產生了三個log檔案。

// Create a file rotating logger with 5mb size max and 3 rotated files        //auto rotating_logger = spd::rotating_logger_mt("some_logger_name", "logs/rotating.txt", 1048576 * 5, 3);        auto rotating_logger = spd::rotating_logger_mt("some_logger_name", "logs/rotating.txt", 256, 2);        for (int i = 0; i < 10; ++i)            rotating_logger->info("{} * {} equals {:>10}", i, i, i*i);

每個檔案內容如下,尾碼數字越大,日誌內容越早:

(4)daily log

每天會建立一個記錄檔,建立記錄檔的時間可自己設定。

// Create a daily logger - a new file is created every day on 2:30am        auto daily_logger = spd::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30);        // trigger flush if the log severity is error or higher        daily_logger->flush_on(spd::level::err);        daily_logger->info(123.44);

上述代碼輸出的日誌,如果程式不退出的話,就是每天2:30 am建立新的檔案。如果一天多次運行這個程式,就會有多個記錄檔,如:

為了把每天的log寫到同一個檔案中去,參考http://blog.csdn.net/yanxiaobugyunsan/article/details/79088533

可以這樣寫:

//建立檔案名稱類似於: log_2018-01-17.txt          typedef spdlog::sinks::daily_file_sink<std::mutex, spdlog::sinks::dateonly_daily_file_name_calculator> dateonly_daily_file_sink_mt;        auto m_logger = spdlog::create<dateonly_daily_file_sink_mt>("m_logger", "logs/dateonly.txt", 0, 0);        m_logger->info("test daily info");        m_logger->error("test daily error");

(5)flush 將buffer刷入檔案

遇到指定層級的日誌會立馬將緩衝輸出到檔案中,如果不立刻寫入,當程式發生崩潰或產生異常而退出時,有些重要log可能還沒等寫入到檔案中。日誌的各個層級如下面代碼所示:

typedef enum{    trace = 0,    debug = 1,    info = 2,    warn = 3,    err = 4,    critical = 5,    off = 6} level_enum;
// trigger flush if the log severity is error or higher                daily_logger->flush_on(spd::level::err);        daily_logger->info(123.44);        daily_logger->error("Error happended! ");


3、MFC中調用spdlog

c++ 日誌輸出庫 spdlog 簡介(1)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.