參考文章:log庫spdlog簡介及使用 - 網路資源是無限的 - CSDN博客 http://blog.csdn.net/fengbingchun/article/details/78347105spdLog的使用 - 煙消bug雲散的專欄 - CSDN博客 http://blog.csdn.ne... ...
參考文章:
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