日誌是所有軟體調試和定位問題的有效工具,擁有一個良好的日誌系統可以協助開發人員快速定位問題可能出在什麼地方。一款好的日誌系統可以根據使用者的意願任意控制哪些日誌可以輸出、什麼時候可以輸出。同相也可以通過設定檔任意控制日誌輸出層級。
log4cplus是一款優秀的基於C/C++的開源日誌庫。log4cplus具有安全執行緒,不用但心在多線程狀態下寫日誌問題;使用靈活,可通過設定檔設定記錄層級下輸出位置,還可以在程式運行時動態設定日誌輸出層級,隨心所欲掌控日誌的輸出;以及多粒度控制的特點。通過將資訊劃分優先順序使其可以面向程式調試、運行、測試、和維護等全生命週期; 可以選擇將資訊輸出到螢幕、檔案、NT event log、甚至是遠程伺服器;通過指定策略對日誌進行定期備份。可以滿足大部分開發人員對日誌系統需求,功能全面。
一、 linux下安裝
在官方網站下載最新log4cplus源碼,通過以下幾步安裝:
1、解壓源碼
tar xvzf log4cplus-x.x.x.tar.gz
2、進入解壓目錄安裝
cd log4cplus-x.x.x
2.1、配置編譯選項,可以configure跟--help參數查看所有配置選項協助
./configure
2.2、編譯並安裝
make
make install
這裡我採用預設安裝路徑:/usr/local,可以通過--prefix=/install/path指定安裝路徑。
二、log4cplus內容簡介與設定檔使用
log4cplus內容介紹
1. Logger對象
Logger對象具有階層,按名稱區分,如下代碼:
在log4cplus中logger的儲存機制中,所有logger都通過一個層次化的結構來組織的,有一個Root層級的logger,可以通過以下方法擷取:
Logger root = Logger::getRoot();
使用者定義的logger都有一個名字與之對應,比如:
Logger test = Logger::getInstance("test");
可以定義該logger的子logger:
Logger subTest = Logger::getInstance("test.subtest");
注意Root層級的logger只有通過getRoot方法擷取,Logger::getInstance("root")獲得的是它的子物件而已。有了這些具有父子關係的logger之後可分別設定其LogLevel,比如:
root.setLogLevel( ... );
Test.setLogLevel( ... );
subTest.setLogLevel( ... );
2. 優先順序
log4cplus優先順序有低到高:
NOT_SET_LOG_LEVEL :接受預設的LogLevel,如果有父logger則繼承它的LogLevel
ALL_LOG_LEVEL :開放所有log資訊輸出
TRACE_LOG_LEVEL :開放trace資訊輸出(即ALL_LOG_LEVEL)
DEBUG_LOG_LEVEL :開放debug資訊輸出
INFO_LOG_LEVEL :開放info資訊輸出
WARN_LOG_LEVEL :開放warning資訊輸出
ERROR_LOG_LEVEL :開放error資訊輸出
FATAL_LOG_LEVEL :開放fatal資訊輸出
OFF_LOG_LEVEL :關閉所有log資訊輸出
3、以下是使用設定檔配置日誌輸出層級與輸出位置執行個體:
//使用日誌配置初始化log日誌
#define INIT_LOG(filePath) log4cplus::PropertyConfigurator::doConfigure(filePath)
//設定記錄層級
#define SET_LOG_LEVEL(level) log4cplus::Logger::getRoot().setLogLevel(level)
//定義日誌輸出
#define LOG_TRACE(logs) LOG4CPLUS_TRACE(log4cplus::Logger::getRoot(), logs)
#define LOG_DEBUG(event) LOG4CPLUS_DEBUG(log4cplus::Logger::getRoot(), event)
#define LOG_INFO(logs) LOG4CPLUS_INFO(log4cplus::Logger::getRoot(), logs)
#define LOG_ERROR(logs) LOG4CPLUS_ERROR(log4cplus::Logger::getRoot(), logs)
設定檔(其它記錄層級配置相同):
log4cplus.rootLogger=TRACE, ALL_MSGS, DEBUG_MSGS, ERROR_MSGS ,TRACE_MSGS ,INFO_MSGS
#設定日誌追加到檔案尾
log4cplus.appender.DEBUG_MSGS=log4cplus::RollingFileAppender
#設定記錄檔大小
log4cplus.appender.DEBUG_MSGS.MaxFileSize=100MB
#設定組建記錄檔最大個數
log4cplus.appender.DEBUG_MSGS.MaxBackupIndex=10
#設定輸出日誌路徑
log4cplus.appender.DEBUG_MSGS.File=/mnt/hgfs/2.linuxfile/8.object/systemdata/log/system.debug
log4cplus.appender.DEBUG_MSGS.layout=log4cplus::PatternLayout
#設定日誌列印格式
log4cplus.appender.DEBUG_MSGS.layout.ConversionPattern=|%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.DEBUG_MSGS.filters.1=log4cplus::spi::LogLevelMatchFilter
#匹配相同記錄層級,只有debug日誌才輸入到該檔案中
log4cplus.appender.DEBUG_MSGS.filters.1.LogLevelToMatch=DEBUG
log4cplus.appender.DEBUG_MSGS.filters.1.AcceptOnMatch=true
log4cplus.appender.DEBUG_MSGS.filters.2=log4cplus::spi::DenyAllFilter
簡單使用:
int main()
{
INIT_LOG(LOG_CONFIG_PATH);
SET_LOG_LEVEL( log4cplus::ALL_LOG_LEVEL);
SetSignal();
LOG_DEBUG("debug");
LOG_ERROR("error");
LOG_INFO("info");
LOG_TRACE("trace");
return 0;
}