基於腳本配置來過濾log信息
除了通過程序實現對log環境的配置之外,log4cplus通過PropertyConfigurator類實現了基於腳本配置的功能。通過
腳本可以完成對logger、appender和layout的配置,因此可以解決怎樣輸出,輸出到哪裡的問題,我將在全文的最後
一部分中提到多線程環境中如何利用腳本配置來配合實現性能測試,本節將重點介紹基腳本實現過濾log信息的功能。
首先簡單介紹一下腳本的語法規則:
包括Appender的配置語法和logger的配置語法,其中:
1.Appender 的配置語法:
1.1 設置名稱:
/*設置方法*/log4cplus.appender.appenderName=fully.qualified.name.of.appender.class
例如(列舉了所有可能的Appender,其中SocketAppender這裡沒有使用):
log4cplus.appender.append_1=log4cplus::ConsoleAppender
log4cplus.appender.append_2=log4cplus::FileAppender
log4cplus.appender.append_3=log4cplus::RollingFileAppender
log4cplus.appender.append_4=log4cplus::DailyRollingFileAppender
log4cplus.appender.append_4=log4cplus::SocketAppender
1.2. 設置Filter:
包括選擇過濾器和設置過濾條件,可選擇的過濾器包括:LogLevelMatchFilter、LogLevelRangeFilter、和StringMatchFilter:
對LogLevelMatchFilter來說,過濾條件包括LogLevelToMatch和AcceptOnMatch(true|false), 只有當log信息的LogLevel值與LogLevelToMatch相同,且AcceptOnMatch為true時才會匹配。
LogLevelRangeFilter來說,過濾條件包括LogLevelMin、LogLevelMax和AcceptOnMatch,只有當log信息的LogLevel在LogLevelMin、LogLevelMax之間同時AcceptOnMatch為true時才會匹配。
對StringMatchFilter來說,過濾條件包括StringToMatch和AcceptOnMatch,只有當log信息的LogLevel值與StringToMatch對應的LogLevel值與相同, 且AcceptOnMatch為true時會匹配。
過濾條件處理機制類似於IPTABLE的Responsibility chain,(即先deny、再allow)不過執行順序剛好相反,後寫的條件會被先執行,比如:
log4cplus.appender.append_1.filters.1=log4cplus::spi::LogLevelMatchFilterlog4cplus.appender.append_1.filters.1.LogLevelToMatch=TRACElog4cplus.appender.append_1.filters.1.AcceptOnMatch=true#log4cplus.appender.append_1.filters.2=log4cplus::spi::DenyAllFilter
會首先執行filters.2的過濾條件,關閉所有過濾器,然後執行filters.1,僅匹配TRACE信息。
1.3. 設置Layout
可以選擇不設置、TTCCLayout、或PatternLayout
如果不設置,會輸出簡單格式的log信息。
設置TTCCLayout如下所示:log4cplus.appender.ALL_MSGS.layout=log4cplus::TTCCLayout
設置PatternLayout如下所示:log4cplus.appender.append_1.layout=log4cplus::PatternLayoutlog4cplus.appender.append_1.layout.ConversionPattern=%d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p - %m%n
2.logger的配置語法
同一個 logger 下的 Appender 會輸出內容到該logger 下的所有文件,可以通過 LogLevel 等措施拉過濾。
下面演示了建立不同logger,隔離輸出內容的方法。
包括rootLogger和non-root logger。
對於rootLogger來說:log4cplus.rootLogger=[LogLevel], appenderName, appenderName, ...
對於non-root logger來說:log4cplus.logger.logger_name=[LogLevel|INHERITED], appenderName, appenderName, ...
腳本方式使用起來非常簡單,只要首先加載配置即可(urconfig.properties是自行定義的配置文件):
PropertyConfigurator::doConfigure("urconfig.properties");下面我們通過例子體會一下log4cplus強大的基於腳本過濾log信息的功能。
下面建立的是 VS2012 的WIN32控制台工程 log4cplus_test,用來演示日志輸出,
工程需要注意兩點:
1. 使用的是最新的 log4cplus-1.1.1 版本,鏈接的是其中的靜態庫 log4cplusSD.lib
2. 工程需要設置 字符集為 "使用多字節字符集",設置方法是VS2012 菜單:
項目->log4cplus_test屬性->配置屬性->字符集
下面是配置文件 urconfig.properties 的內容,使用配置來控制log4cplus 的log 輸出.
#全局默認根 logger,這裡忽略
#log4cplus.rootLogger=TRACE, ALL_MSGS, TRACE_MSGS, DEBUG_INFO_MSGS, FATAL_MSGS
#log4cplus.rootLogger=TRACE,ALL_MSGS
#log4cplus.appender.ALL_MSGS=log4cplus::RollingFileAppender
#log4cplus.appender.ALL_MSGS.File=./logout/all_msgs.log
#log4cplus.appender.ALL_MSGS.layout=log4cplus::TTCCLayout
#獨立的 logger 的配置語法,支持兩個 appender
log4cplus.logger.APPfilelogger = TRACE,APP,APP_DAILY
og4cplus.additivity.APPfilelogger = false
#獨立的 logger 的配置語法,同一個 logger 下會發送到所有文件,
#是否寫入到所有文件,通過 LogLevel 來控制
log4cplus.logger.SYSfilelogger = TRACE,SYS
#log4cplus.additivity.SYSfilelogger = TRUE
#獨立的 logger 的配置語法
log4cplus.logger.ACCfilelogger = TRACE,ACC
#log4cplus.additivity.ACCfilelogger = TRUE
#支持只寫入同一個 logger 下的指定文件
log4cplus.appender.APP=log4cplus::RollingFileAppender
log4cplus.appender.APP.File=./logout/app_msgs.log
log4cplus.appender.APP.ImmediateFlush=false
log4cplus.appender.APP.MaxFileSize=1MB
#log4cplus.appender.APP.MinFileSize=1M
log4cplus.appender.APP.MaxBackupIndex=3
log4cplus.appender.APP.layout=log4cplus::PatternLayout
log4cplus.appender.APP.layout.ConversionPattern=%D{%Y-%m-%d %H:%M:%S.%Q}|%-5p|%c[2]|%t|%F:%L|%m%n
log4cplus.appender.APP.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.APP.filters.1.LogLevelMin=TRACE
log4cplus.appender.APP.filters.1.LogLevelMax=FATAL
#支持只寫入同一個 logger 下的指定文件
log4cplus.appender.APP_DAILY=log4cplus::DailyRollingFileAppender
log4cplus.appender.APP_DAILY.File=./logout/app_msgs_d.log
#MONTHLY,WEEKLY,DAILY,TWICE_DAILY,HOURLY,MINUTELY
log4cplus.appender.APP_DAILY.Schedule=MINUTELY
log4cplus.appender.APP_DAILY.DatePattern='.'yyyy-MM-dd
log4cplus.appender.APP_DAILY.ImmediateFlush=false
log4cplus.appender.APP_DAILY.MaxBackupIndex=3
log4cplus.appender.APP_DAILY.layout=log4cplus::PatternLayout
log4cplus.appender.APP_DAILY.layout.ConversionPattern=%D{%Y-%m-%d %H:%M:%S.%Q}|%-5p|%c[2]|%t|%F:%L|%m%n
log4cplus.appender.APP_DAILY.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.APP_DAILY.filters.1.LogLevelMin=TARCE
log4cplus.appender.APP_DAILY.filters.1.LogLevelMax=FATAL
#支持只寫入同一個 logger 下的指定文件
log4cplus.appender.SYS=log4cplus::RollingFileAppender
log4cplus.appender.SYS.File=./logout/sys_msgs.log
log4cplus.appender.SYS.MaxFileSize=1MB
log4cplus.appender.SYS.MaxBackupIndex=3
log4cplus.appender.SYS.ImmediateFlush=false
log4cplus.appender.SYS.layout=log4cplus::PatternLayout
log4cplus.appender.SYS.layout.ConversionPattern=%D{%Y-%m-%d %H:%M:%S.%Q}|%-5p|%c[2]|%t|%F:%L|%m%n
log4cplus.appender.SYS.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.SYS.filters.1.LogLevelMin=TRACE
log4cplus.appender.SYS.filters.1.LogLevelMax=FATAL
#支持只寫入同一個 logger 下的指定文件
log4cplus.appender.ACC=log4cplus::RollingFileAppender
log4cplus.appender.ACC.File=./logout/acc_msgs.log
log4cplus.appender.ACC.MaxFileSize=1MB
log4cplus.appender.ACC.MaxBackupIndex=3
log4cplus.appender.ACC.ImmediateFlush=false
log4cplus.appender.ACC.layout=log4cplus::PatternLayout
log4cplus.appender.ACC.layout.ConversionPattern=%D{%Y-%m-%d %H:%M:%S.%Q}|%-5p|%c[2]|%t|%F:%L|%m%n
log4cplus.appender.ACC.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.ACC.filters.1.LogLevelMin=TRACE
log4cplus.appender.ACC.filters.1.LogLevelMax=FATAL