程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 在單進程單線程或單進程多線程下實現log4cplus寫日志並按大小分割

在單進程單線程或單進程多線程下實現log4cplus寫日志並按大小分割

編輯:C++入門知識

在單進程單線程或單進程多線程下實現log4cplus寫日志並按大小分割


基於腳本配置來過濾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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved