程序跑着跑着出錯了,自然就要去看日誌文件,研究研究是哪裡出錯了。同時,記錄日誌也不能太慢了,速度總是十分重要的。Spdlog,也就是 Speed Log 的縮寫,這個連名字都帶着速度的 C++ 日誌庫,應該會讓你滿意。
C++
簡介
Spdlog,是在 Github 上由 gabime 開源的 C++ 日誌庫,代碼倉在
https://github.com/gabime/spdlog,目前版本為 1.6.1。Spdlog 以速度著稱,且是 Header-Only 的,使用方便,兼容多個平台。Spdlog 還具有:格式化、異步模式、單線程/多線程、豐富的日誌輸出目標、運行時日誌級別修改、Backtrace記錄等,功能豐富,可以滿足絕大多數場景的需求。
Spdlog日誌庫
安裝
可以使用 Header-Only 的方式,把源碼複製到項目的編譯樹中,並使用 C++11 的編譯器編譯。
也可以使用靜態庫的方式,先對 spdlog 編譯後再鏈接到項目代碼中:
git clone https://github.com/gabime/spdlog.git
cd spdlog && mkdir build && cd build
cmake .. && make -jSpdlog支持的平台廣泛,包括:
- Linux, FreeBSD, OpenBSD, Solaris, AIX
- Windows (msvc 2013+, cygwin)
- macOS (clang 3.5+)
- Android
也可以使用包管理的方式直接安裝,如使用 Hombrew
brew install spdlog而在 Fedora 上可以使用yum等
yum install spdlog示例
以下給出 Spdlog 的一個基本使用例子:
#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"
int main()
{
spdlog::info("Welcome to spdlog!");
spdlog::warn("Easy padding in numbers like {:08d}", 12);
spdlog::error("Positional args are {1} {0}..", "too", "supported");
}Spdlog使用了 fmt 庫進行日誌的格式化,可以直接調用 info、warn 等函數,使用默認的記錄器進行日誌輸出。
日誌級別和格式都是可以在運行時修改的,使用 set_level 和 set_pattern 函數進行:
spdlog::set_level(spdlog::level::debug);
spdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");Spdlog 支持多種日誌輸出目標,包括命令行的 stdout 和 stderr、基本文件、輪轉文件、每日更新的文件、POSIX 的 syslog、systemd、Windows 的 Debug等。不同的輸出目標都需要包含對應的頭文件,並使用對應的工廠構建函數。
Spdlog 支持單線程和多線程的日誌記錄器,其中多線程版本的是線程安全的。單線程版本的工廠函數以 _st 結尾,而多線程版本則以 _mt 結尾。
可以使用不同輸出目標和不同線程版本的 logger 來進行定製化記錄。如
#include "spdlog/sinks/rotating_file_sink.h"
auto file_logger = spd::rotating_logger_mt("file_logger", "logs/mylogfile", 1048576 * 5, 3);定義了一個多線程輪轉文件的 logger,名字為 file_logger,輸出文件路徑為 logs/mylogfile,最大大小為 5MB,最多保留 3 個文件。而
#include "spdlog/sinks/daily_file_sink.h"
auto daily_logger = spdlog::daily_logger_st("daily_logger", "logs/daily", 14, 55);則定義了一個單線程的每日更新文件的 logger,名字為 daily_logger,輸出路徑為 logs/daily,且在每天的 14:55 分創建新的日誌文件。
更多
- Spdlog 支持對於 Backtrace 的存儲,可以在緩存記錄一定數量的日誌消息,並在需要時輸出;
spdlog::enable_backtrace(32);
...
spdlog::dump_backtrace();- Spdlog 支持異步模式,使用預設的線程池進行異步日誌記錄,可以提升多線程的速度;
auto async_file = spdlog::basic_logger_mt<spdlog::async_factory>("async_file_logger", "logs/async_log.txt");- Spdlog支持 logger 的中心化註冊,方便 logger 的引用;
spdlog::register_logger(some_logger);
auto logger = spdlog::get("logger1");- Spdlog 性能優越,在性能測試中,進行了100萬次循環測試,其中:單線程的基本文件 logger 達到每秒 5,777,626(約578萬)次,平均每條消息耗時 0.17微秒,輪轉文件和每日更新文件也得到了同樣的性能;而在10個線程競爭同一個文件時,也能得到每秒 1,659,613(約166萬)次的性能;使用10個線程的異步模式則能達到每秒 2,682,285(約268萬)次。

Spdlog極致快速
總結
Spdlog 性能優越,功能豐富,內置支持十餘種輸出目標,支持單線程/多線程和異步,另外有註冊功能和 Backtrace 記錄等方便使用的功能,使得 Spdlog 能夠適用於絕大多數的日誌記錄場景。
Spdlog 採用 Header-Only 的方式設計,方便使用;代碼格式標準,結構清晰,模塊化程度高,代碼質量高;項目測試和性能測試齊全,編譯支持完善;目前社區也比較活躍,是一個值得學習和參與的開源項目。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/222080.html
微信掃一掃
支付寶掃一掃