說起日誌系統,不得不提大名鼎鼎的Log4j,特別是使用Java的人們,可以說是無人不知無人不曉無人不用。Log4j以其簡單的使用方式(引入一個jar包,一行代碼即可調用),靈活(可通過配置文件隨意配置),功能強大(多個級別,可配置多個輸出目的地,Console,File,系統日誌,遠端的LogServer等等,可訂製日誌格式,自動產生,刪除日誌文件)等等等等特性,一直是Java日誌系統的首選。
1.Log4j的C++版本Log4cplus
上面說到,日誌在現在的系統裏必不可少,Java有功能強大的Log4j可以使用,作爲最重要變成語言之一的C++有什麼選擇呢?
幸運的是,有一些大牛很早之前就發現了這個問題,他們仿照Log4J,使用C++語言開發了一套日誌系統Log4cplus,Log4cplus的目的很明確,打造C++版的Log4j。而且最重要的是Log4cplus是開源的。
2.使用簡介
1)下載http://sourceforge.net/projects/log4cplus/
2)Log4j是一個C++庫,編譯以後即可使用。同時log4cplus支持windows和linux:
windows下:打開根目錄下的msvc10下面的vs工程,編譯即可。
Linux下:configure, make
3)使用
a)最簡單的使用方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include
<log4cplus/logger.h> #include
<log4cplus/configurator.h> #include
<iomanip> using
namespace
log4cplus; int main() { BasicConfigurator
config; config.configure(); Logger
logger = Logger::getInstance( "main" ); LOG4CPLUS_WARN(logger, "Hello,
World!" ); return
; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/*
嚴格實現步驟1-6,appender輸出到屏幕, 其中的佈局格式和LogLevel後面會詳細解釋。*/ #include
<log4cplus logger.h=""></log4cplus> #include
<log4cplus consoleappender.h=""></log4cplus> #include
<log4cplus layout.h=""></log4cplus> using
namespace
log4cplus; using
namespace
log4cplus::helpers; int
main(){ /*
step 1: Instantiate an appender object */ SharedObjectPtr
_append ( new
ConsoleAppender()); _append->setName( "append
for test" ); /*
step 2: Instantiate a layout object */ std::string
pattern = "%d{%m/%d/%y
%H:%M:%S} - %m [%l]%n" ; std::auto_ptr
_layout( new
PatternLayout(pattern)); /*
step 3: Attach the layout object to the appender */ _append->setLayout(
_layout ); /*
step 4: Instantiate a logger object */ Logger
_logger = Logger::getInstance( "test" ); /*
step 5: Attach the appender object to the logger */ _logger.addAppender(_append); /*
step 6: Set a priority for the logger */ _logger.setLogLevel(ALL_LOG_LEVEL); /*
log activity */ LOG4CPLUS_DEBUG(_logger, "This
is the FIRST log message..." ) sleep(1); LOG4CPLUS_WARN(_logger, "This
is the SECOND log message..." ) return
0; } |
4)配置
Log4cplus配置基本與log4J相同。下面是一個例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
log4cplus.rootLogger=DEBUG,
STDOUT, ALL_MSGS log4cplus.appender.STDOUT=log4cplus::ConsoleAppender log4cplus.appender.STDOUT.layout=log4cplus::PatternLayout #log4cplus.appender.STDOUT.layout.ConversionPattern=%d{%m/%d/%y
%H:%M:%S} [%t] %-5p %c{2} %%%x%% - %m [%l]%n log4cplus.appender.STDOUT.layout.ConversionPattern=[%-5p
%d{%y-%m-%d %H:%M:%S}] [%l]%n%m%n%n #設置日誌追加到文件尾 log4cplus.appender.ALL_MSGS=log4cplus::RollingFileAppender #設置日誌文件大小 log4cplus.appender.ALL_MSGS.MaxFileSize=100MB #設置生成日誌最大個數 log4cplus.appender.ALL_MSGS.MaxBackupIndex=10 #設置輸出日誌路徑 log4cplus.appender.ALL_MSGS.File= log /test. log log4cplus.appender.ALL_MSGS.layout=log4cplus::PatternLayout #設置日誌打印格式 #log4cplus.appender.ALL_MSGS.layout.ConversionPattern=|%D:%d{%Q}|%p|%t|%l|%m|%n log4cplus.appender.ALL_MSGS.layout.ConversionPattern=[%-5p
%d{%y-%m-%d %H:%M:%S}] [%l]%n%m%n%n #匹配相同日誌級別,只有debug日誌才輸入到該文件中 #log4cplus.appender.ALL_MSGS.filters.1=log4cplus::spi::LogLevelMatchFilter #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 |