一、log4cpp概述
Log4cpp是一個開源的C++類庫,它提供了C++程序中使用日志和跟蹤調試的功能,它的優點如下:
-
- 提供應用程序運行上下文,方便跟蹤調試;
- 可擴展的、多種方式記錄日志,包括命令行、文件、回卷文件、內存、syslog服務器、Win事件日志等;
- 可以動態控制日志記錄級別,在效率和功能中進行調整;
- 所有配置可以通過配置文件進行動態調整;
- 多語言支持,包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(log4p)等;
二、原理
Log4cpp有三個主要的組件:日志類別(Category)、輸出源(Appender)和布局(Layout)。這三種類型的組件一起工作使得系統可以根據信息的類型和級別記錄它們,並且在運行時控制這些信息的輸出格式和位置。
三個組件的介紹:
1)日志類別(Category)含義是:如果配置文件中設置的級別是DEBUG,則任意的log都能打印出來;但如果配置的級別是ERROR,則只有高於ERROR優先級的日志才可以打印出來。
日志的常用優先級:DEBUG < INFO < WARN < ERROR < FATAL
2)輸出源(Appender)用來輸出日志(被layout格式化后)到一些設備上,比如文件、命令行、內存等。也可以定義自己的appender輸出日志信息到別的設備上。log4cpp提供的appender如下: FileAppender 輸出到文件 RollingFileAppender 輸出到回卷文件,即當文件到達某個大小后回卷 ConsoleAppender 輸出到控制台
3)布局(Layout):顯示樣式PatternLayout表示讓用戶根據類似於C語言printf函數的轉換模式來指定輸出格式
三個組件之間的關系:
- Category和Appender的關系是:多個Appender可以附加到一個Category上,這樣一個日志消息可以同時輸出到多個設備上。
- Appender和Layout的關系是:Layout附加在Appender上,appender調用layout處理完日志消息后,記錄到某個設備上。
三、配置文件log4cpp.conf
內容如下:
1 #-------定義rootCategory的屬性------- 2 3 #指定rootCategory的log優先級是ERROR,其Appenders有兩個,分別是console,TESTAppender 4 log4cpp.rootCategory=ERROR, console,TESTAppender 5 6 #-------定義console屬性------- 7 8 #consoleAppender類型:控制台輸出 9 #下面這三條語句表示控制台輸出的log輸出的布局按照指定的格式;輸出格式是:[%p] %d{%H:%M:%S.%l} (%c): %m%n 10 log4cpp.appender.console=ConsoleAppender 11 log4cpp.appender.console.layout=PatternLayout 12 log4cpp.appender.console.layout.ConversionPattern=[%p] %d{%H:%M:%S.%l} (%c): %m%n 13 14 #-------定義TESTAppender的屬性------- 15 16 #RollingFileAppender類型:輸出到回卷文件,即文件到達某個大小的時候產生一個新的文件 17 #下面的語句表示文件輸出到指定的log文件,輸出的布局按照指定的格式,輸出的格式是:[%d{%Y-%m-%d %H:%M:%S.%l} - %p] (%c): %m%n 18 log4cpp.appender.TESTAppender=RollingFileAppender 19 20 #當日志文件到達maxFileSize大小時,將會自動滾動
21 log4cpp.appender.TESTAppender.maxFileSize=400000 22 23 #maxBackupIndex指定可以產生的滾動文件的最大數 24 log4cpp.appender.TESTAppender.maxBackupIndex=3 25 26 #fileName指定信息輸出到logs/TESTAppender.txt文件 27 log4cpp.appender.TESTAppender.fileName=logs/TESTAppender.txt 28 29 #PatternLayout 表示可以靈活指定布局模式 30 log4cpp.appender.TESTAppender.layout=PatternLayout 31 32 #append=true 信息追加到上面指定的日志文件中,false表示將信息覆蓋指定文件內容 33 log4cpp.appender.TESTAppender.append=true 34 log4cpp.appender.TESTAppender.layout.ConversionPattern=[%d{%Y-%m-%d %H:%M:%S.%l} - %p] (%c): %m%n
ConversionPattern的參數含義:
- %d 輸出日志時間點的日期或時間,可以在其后指定格式,如上%d{%Y-%m-%d %H:%M:%S.%l},輸出類似:2017-02-14 09:25:00.953
- %p 優先級,即DEBUG,INFO,WARN,ERROR,FATAL
- %c 輸出日志信息所屬的類目,通常就是所在類的全名
- %m 輸出log的具體信息
- %n 回車換行
四、實際應用
在問題定位的過程中,有時由於設置的日志級別較高,打印出來的信息不夠全面,因此需要通過修改配置文件來動態調整日志級別,即修改屬性值log4cpp.rootCategory=ERROR 為 log4cpp.rootCategory=DEBUG 這樣就可以看到最新的DEBUG級別以上的日志信息了。