c++日志庫log4cplus快速入門小結(jié)
簡介
log4j 用于Java,log4cplus從它衍生而來,用于c++。
用于c++的日志庫還有很多,如 log4cxx等,可以根據(jù)實(shí)際需求選擇使用。
log4cplus 的地址:https://github.com/log4cplus/log4cplus。
log4cplus是一種易于使用的C ++日志記錄API,可提供線程安全,靈活且任意粒度的日志管理和配置控制。
本文旨在快速使用。
日志等級
log4cplus 提供的日志等級如下:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
舉例來說,
- 如果定義了日志等級為 ERROR,那么只有標(biāo)記為 ERROR, FATAL的日志信息才會被記錄
- 如果等級為 DEBUG,則所有標(biāo)記為 DEBUG/INFO/WARN/ERROR/FATAL 的日志才會被記錄
- ALL和OFF級別用來將所有其他類型的級別分別切換為打開或關(guān)閉的標(biāo)志,不會用于設(shè)置日志級別
配置文件
關(guān)于配置文件,說明幾點(diǎn):
- 日志輸出到 appenders,appenders 可以是文件或者控制臺,可以把輸出當(dāng)作cpp流的概念
- 一個日志類別可以關(guān)聯(lián)到多個 appenders
- 所有的日志類別都是從抽象 root 類繼承日志級別和 appender,除非另行定義
- 支持記錄工作線程的id,用來分析線程行為
下面是一個配置文件的示例:
# 文件名:log4cplus.config ################################### ########Define log Levels########## ################################### # 告警級別由低到高排序: TRACE DEBUG INFO WARN ERROR FATAL #All classes - except those in log4cplus.logger.* - use DEBUG level to print information on file log4cplus.rootLogger=WARN, MyFileAppender #For MemoryCheck class I need to inspect all the details, and I want print information even to the console log4cplus.logger.MemoryCheck=INFO, MyConsoleAppender #For database stuff, I don't need to logging everything, it's enough printing only errors! log4cplus.logger.DatabaseOperations=ERROR ################################### ########Define the Appenders####### ################################### #MyConsoleAppender: log4cplus.appender.MyConsoleAppender=log4cplus::ConsoleAppender log4cplus.appender.MyConsoleAppender.layout=log4cplus::PatternLayout log4cplus.appender.MyConsoleAppender.layout.ConversionPattern=[%-5p][%d] %m%n #MyFileAppender log4cplus.appender.MyFileAppender=log4cplus::RollingFileAppender log4cplus.appender.MyFileAppender.File=logging.txt log4cplus.appender.MyFileAppender.MaxFileSize=16MB log4cplus.appender.MyFileAppender.MaxBackupIndex=1 log4cplus.appender.MyFileAppender.layout=log4cplus::PatternLayout log4cplus.appender.MyFileAppender.layout.ConversionPattern=[%-5p][%D{%Y/%m/%d %H:%M:%S:%q}][%-l][%t] %m%n
其中,
- 每個logger可以添加級別和apppender,分別為第一個參數(shù)和第二個參數(shù)
- MemoryCheck和DatabaseOperations都繼承rootLogger的屬性,但它們各自的定義會與root共存,如 MemoryCheck 會打印 info 級別以上日志,并且同時輸出到文件和控制臺
- 直接使用根節(jié)點(diǎn):
Logger logger = Logger::getRoot();
- 每個 apppender 可以設(shè)置日志輸出位置、路徑、layout等內(nèi)容
- appender輸出位置的輸出位置可以是控制臺、文件,其中文件可以是 FileAppender / RollingFileAppender / DailyRollingFileAppender / TimeBasedRollingFileAppender
- layout是控制日志輸出格式的,格式有三種類型:
- SimpleLayout 是一種簡單格式的布局器,在輸出的原始信息之前加上LogLevel和一個"-"
- TTCCLayout 其格式由時間,線程ID,Logger和NDC 組成
- PatternLayout 是一種有詞法分析功能的模式布局器,類似正則表達(dá)式。以“%”作為開頭的特殊預(yù)定義標(biāo)識符,將產(chǎn)生特殊的格式信息,如下:
(1)"%%",轉(zhuǎn)義為% 。 (2)"%c",輸出logger名稱,如test.subtest 。也可以控制logger名稱的顯示層次,比如"%c{1}"時輸出"test",其中數(shù)字表示層次。 (3)"%D",顯示本地時間,比如:"2004-10-16 18:55:45",%d顯示標(biāo)準(zhǔn)時間。 可以通過%d{...}定義更詳細(xì)的顯示格式,比如%d{%H:%M:%s}表示要顯示小時:分鐘:秒。大括號中可顯示的預(yù)定義標(biāo)識符如下: %a -- 表示禮拜幾,英文縮寫形式,比如"Fri" %A -- 表示禮拜幾,比如"Friday" %b -- 表示幾月份,英文縮寫形式,比如"Oct" %B -- 表示幾月份,"October" %c -- 標(biāo)準(zhǔn)的日期+時間格式,如"Sat Oct 16 18:56:19 2004" %d -- 表示今天是這個月的幾號(1-31)"16" %H -- 表示當(dāng)前時刻是幾時(0-23),如"18" %I -- 表示當(dāng)前時刻是幾時(1-12),如"6" %j -- 表示今天是哪一天(1-366),如"290" %m -- 表示本月是哪一月(1-12),如"10" %M -- 表示當(dāng)前時刻是哪一分鐘(0-59),如"59" %p -- 表示現(xiàn)在是上午還是下午,AM or PM %q -- 表示當(dāng)前時刻中毫秒部分(0-999),如"237" %Q -- 表示當(dāng)前時刻中帶小數(shù)的毫秒部分(0-999.999),如 "430.732" %S -- 表示當(dāng)前時刻的多少秒(0-59),如"32" %U -- 表示本周是今年的第幾個禮拜,以周日為第一天開始計算(0-53),如 "41" %w -- 表示禮拜幾,(0-6, 禮拜天為0),如"6" %W -- 表示本周是今年的第幾個禮拜,以周一為第一天開始計算(0-53),如 "41" %x -- 標(biāo)準(zhǔn)的日期格式,如"10/16/04" %X -- 標(biāo)準(zhǔn)的時間格式,如"19:02:34" %y -- 兩位數(shù)的年份(0-99),如"04" %Y -- 四位數(shù)的年份,如"2004" %Z -- 時區(qū)名,比如"GMT" (4)"%F",輸出當(dāng)前記錄器所在的文件名稱,比如"main.cpp" (5)"%L",輸出當(dāng)前記錄器所在的文件行號,比如"51" (6)"%l",輸出當(dāng)前記錄器所在的文件名稱和行號,比如"main.cpp:51" (7)"%m",輸出原始信息。 (8)"%n",換行符。 (9)"%p",輸出LogLevel,比如"DEBUG" (10)"%t",輸出記錄器所在的線程ID,比如 "1075298944" (11)"%x",嵌套診斷上下文NDC (nested diagnostic context) 輸出,從堆棧中彈出上下文信息,NDC可以用對不同源的log信息(同時地)交叉輸出進(jìn)行區(qū)分。 (12)格式對齊,比如"%-10m"時表示左對齊,寬度是10,當(dāng)然其它的控制字符也可以相同的方式來使用,比如"%-12d","%-5p"等等。
log4cplus提供一個類【PropertyConfigurator】來實(shí)現(xiàn)從文件讀取配置,參數(shù)就是文件名。其他參數(shù)采用默認(rèn),初始化時使用。
使用
關(guān)于初始化
使用前必須初始化,代碼如下:
#include <log4cplus/logger.h> #include <log4cplus/configurator.h> { log4cplus::initialize(); log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log4cplus.config")); }
可以把這段代碼放在main的開頭,或者專門用來做初始化的類中??傊谑褂?Log4cplus 的實(shí)例前,必須初始化。
使用示例
如下代碼:
#include <string> #include <log4cplus/logger.h> #include <log4cplus/configurator.h> #include <log4cplus/loggingmacros.h> using namespace log4cplus; using namespace std; int main() { log4cplus::initialize(); log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log4cplus.config")); log4cplus::Logger m_log = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("MemoryCheck")); try { int x = 8; double y = 8.88; string allocated_memory = "here"; LOG4CPLUS_DEBUG(m_log, "x = " << x); LOG4CPLUS_DEBUG(m_log, "y = " << y); /* ... */ LOG4CPLUS_INFO(m_log, "Allocated = " << allocated_memory); } catch (std::bad_alloc &e) { /* I KNOW HOW TO DEAL WITH THIS ERROR!! */ /* ...code that handle the error is here... */ LOG4CPLUS_ERROR(m_log, e.what()); } catch (std::exception &e) { /* I KNOW HOW TO DEAL WITH THIS ERROR!! */ /* ...code that handle the error is here... */ LOG4CPLUS_ERROR(m_log, e.what()); } catch (...) { /* I DON'T KNOW HOW MANAGE THE ERROR!! */ LOG4CPLUS_FATAL(m_log, "unexpected error...use gdb core dump"); exit(-1); } int memory_remaining = 122; if (memory_remaining < 123) { LOG4CPLUS_WARN(m_log, "LOW MEMORY!!"); } return 0; }
因?yàn)?MemoryCheck 自己定義了 日志級別和 appender,它又從 rootlogger繼承,所以,最終它的日志級別為 INFO,日志同時輸出到控制臺和文件中。
輸出結(jié)果如下:
完整代碼及編譯請移步:log4cplus_demo
以上代碼應(yīng)該不用過多解釋,從中可知各個日志等級的使用方式:
- TRACE:調(diào)試應(yīng)用的詳細(xì)步驟
- DEBUG:算法關(guān)鍵部分的相關(guān)信息
- INFO:應(yīng)用的內(nèi)部狀態(tài)信息
- WARN:可以避免的內(nèi)部狀態(tài)信息
- ERROR:發(fā)生了錯誤,且應(yīng)用程序知道如何處理它
- FATAL:發(fā)生了不可逆轉(zhuǎn)的錯誤,程序無法繼續(xù)運(yùn)行
當(dāng)然,以上分類只是根據(jù)項(xiàng)目需求,具體的日志級別分類應(yīng)該結(jié)合實(shí)際需要,以及相對應(yīng)的處理策略。
總結(jié)
以上介紹了Log4cplus 的基礎(chǔ)使用,里面很多靈活地配置可以在使用中逐步了解。
總之,使用它可以簡單便捷地建立起日志體系,步驟如下:
- 建立配置文件
- 初始化
- 開始使用
參考資料
到此這篇關(guān)于c++日志庫log4cplus快速入門的文章就介紹到這了,更多相關(guān)c++日志庫log4cplus內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析ORB、SURF、SIFT特征點(diǎn)提取方法以及ICP匹配方法
這篇文章主要為大家介紹了常用的特征點(diǎn)提取方法(ORB、SURF、SIFT)和ICP匹配方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-12-12C語言 以數(shù)據(jù)塊的形式讀寫文件詳解及實(shí)現(xiàn)代碼
本文主要介紹 C語言 以數(shù)據(jù)塊的形式讀寫文件,這里對相關(guān)知識資料做了整理,并附代碼示例,以便大家學(xué)習(xí)參考,有學(xué)習(xí)此部分知識的朋友可以參考下2016-08-08解決c++?error:crosses?initialization?of?問題
最近在寫代碼的時候,碰到了?crosses?initialization?of?...?的問題,只因我在?switch?的某個?case?分支下定義了一個變量,于是乎便將這個問題整理一下,需要的朋友可以參考下2023-03-03C++小利器之std::bind參數(shù)綁定包裝器的使用詳解
從 C++11 開始,標(biāo)準(zhǔn)庫提供了 std::bind 用于綁定函數(shù) f 和調(diào)用參數(shù),返回一個新可調(diào)用函數(shù)對象 fn,下面就跟隨小編一起深入了解一下std::bind的具體使用吧2023-12-12