fastlog 的使用
C++ 通用框架的設計 作者: naven
1 fastlog 介紹
fastlog 是參考 log4j 和 log4cplus 框架使用 javen c++ 庫設計實現的日志記錄庫,具有 log4j 庫類似的優點,記錄日志非常方便,擴展和配置也非常容易。 Log4j 日志庫我想應該在 java 的領域已經應用很廣泛了,這樣的日志庫可以非常方便地將日志輸出到屏幕、文件、 syslog 、遠程服務器等任何地方,而日志輸出的格式也可以任意調整,可以很容易控制輸出的日志級別,而這一切僅需修改一下配置文件,應用程序不用作任何修改。
fastlog 主要有如下一些模塊
Appenders 掛接器,定義一些日志輸出的設備終端,如文件、屏幕等
Layouts 布局器,定義輸出的日志格式
Hierarchies 分類器,用于對日志信息分類,即對日志分級,用戶不能直接調用
LoglevelManager 日志級別管理器,即 TRACE, DEBUG, INFO, WARNING, ERROR 等
Logger 記錄器,即記錄日志的對象,每個應用模塊應該擁有一個 Logger
PropertyConfigurator 配置器,用于通過配置文件配置 Logger 和 Appender 、 Layout 等
2 Hello World!
下面的程序示例如何使用 fastlog 記錄日志:
// 定義一個該應用模塊使用的Logger記錄器,命名為”log”
static Logger _logger = Logger::getInstance( " log " );
void main()

{
// 配置器讀取配置文件fastlog.properties初始化Logger,只初始化一次
PropertyConfigurator::doConfigure( " fastlog.properties " );
// 輸出日志
_logger.notice( " This is the NOTICE log message”);
}
日志輸出可能(與 fastlog.properties 配置有關)如下:
2006-08-10 21:44:37 [log]-[NOTICE] This is the NOTICE log message
1 fastlog 配置文件
fastlog 配置文件可能會較復雜,下面先介紹一個典型的 fastlog.properties 如下:
# 這一行不可缺少,定義 fastlog 的日志級別和輸出設備
# fastlog.rootLogger 是 fastlog 的配置標識,不可更改
# = 號后面即為具體設置,后面第一個逗號 ”,” 前是設置日志輸出級別,后面是設置輸出設備
# INFO & ERROR 表示同時輸出 INFO 和 ERROR 級別日志,所以可以任意定義輸出的級別,這跟 log4j 不一樣的
# A1, R 是表示兩個輸出設備,這個名字可以自己定義的,改成 OUT1, OUT2 等都可以
# 這個設備在下面定義輸出設備的詳細設置就會用到
fastlog.rootLogger = INFO & ERROR & CRIT & WARN & FATAL & ALERT & NOTICE & DEBUG, A1, R
# 這部分定義名為 ”A1” 的輸出設備,定義的名稱規則是 fastlog.appender. 加設備名,再加 . 設備屬性
# 這一行定義輸出的設備,即輸出到 Console 控制臺
fastlog.appender.A1 = fastlog::ConsoleAppender
# 這是定義輸出的日志格式,使用 PatternLayout ,即用可配置格式的 Layout 輸出
fastlog.appender.A1.layout = fastlog::PatternLayout
# 這就是定義具體的輸出格式,后面會詳細講
fastlog.appender.A1.layout.ConversionPattern = %D{%Y-%m-%d %H:%M:%S.%q} [%c:%R:%T]-[%5p] %m %n
# 這是定義第二個輸出設備,即 DailyFileAppender 按日期文件輸出,后面詳細講
fastlog.appender.R = fastlog::DailyFileAppender
fastlog.appender.R.File = fastlog.log
fastlog.appender.R.Path = .
fastlog.appender.R.FilePrefixName =
fastlog.appender.R.FileExtendName = .log
fastlog.appender.R.TimeFormatPattern = %Y%m%d%H
fastlog.appender.R.Schedule = HOURLY
fastlog.appender.R.layout = fastlog::PatternLayout
fastlog.appender.R.layout.ConversionPattern = %D{%Y-%m-%d %H:%M:%S.%q} [%c:%R:%T]-[%5p] %m %n
下面講講主要用到的 Appender 和 Layout 的用法
2 fastlog::ConsoleAppender 輸出設備
輸出到控制臺的 Appender ,比較簡單就不詳細講了。
還有 fastlog::FileAppender 也比較簡單,實際用處也不大,配置跟下面類似。
還有 fastlog::NullAppender 比較特殊,哪里也不輸出,主要用于測試。
3 fastlog::DailyFileAppender 輸出設備
按日期時間等自動切分日志的 Appender ,意思是會輸出到帶時間格式命名的文件,到新的時間段如下一天,則自動生成新的日期命名的文件輸出,日志會自動切分,推薦使用。
舉例,按上面的例子,如果當前時間是 2006-8-10 12:00:00 ,日志會自動輸出到 2006081012.log 的文件中,如果當前時間變成 2006-8-10 13:01:00 ,則日志系統會自動創建名為 2006081013.log 的文件,并將新日志輸出到此新文件中。
配置定義如下:
# 定義日志輸出設備為 fastlog::DailyFileAppender
fastlog.appender.R = fastlog::DailyFileAppender
# 這個名字可以不用管它
fastlog.appender.R.File = fastlog.log
# 日志輸出的目錄,此例為當前目錄
fastlog.appender.R.Path = .
# 日志文件名的前綴,如果定義了如 mylog ,則日志文件名前會帶此名字
fastlog.appender.R.FilePrefixName =
# 日志文件名的擴展名,一般都為 .log 吧
fastlog.appender.R.FileExtendName = .log
# 日志文件的日期名格式,與其他日期格式化類似,詳見后面的 PatternLayout
fastlog.appender.R.TimeFormatPattern = %Y%m%d%H
# 日志自動切分可以按如下幾種自動滾動日志
# MONTHLY( 每月 ) WEEKLY( 每周 ) DAILY( 每天 ) TWICE_DAILY( 每兩天 )
# HOURLY( 每小時 ) MINUTELY( 每分鐘 )
fastlog.appender.R.Schedule = HOURLY
# 日志輸出的 Layout 定義
fastlog.appender.R.layout = fastlog::PatternLayout
fastlog.appender.R.layout.ConversionPattern = %D{%Y-%m-%d %H:%M:%S.%q} [%c:%R:%T]-[%5p] %m %n
4 fastlog::RollingFileAppender 輸出設備
按文件大小自動滾動日志的 Appender ,這種方式 Unix 的 syslog 用的比較多。當日志文件達到一定大小后就自動換一個名字備份起來,所以當前日志文件始終不會超過一定大小。
配置定義如下:
# 定義日志輸出設備為 fastlog:: RollingFileAppender
fastlog.appender.R2 = fastlog::RollingFileAppender
# 定義日志輸出的文件,可以帶具體路徑
fastlog.appender.R2.File = fastlog.log
# 定義滾動日志的文件大小,超過此大小則滾動日志,可以用 KB 或 MB 等表示
fastlog.appender.R2.MaxFileSize = 200KB
# 定義最多備份的日志文件數目
fastlog.appender.R2.MaxBackupIndex = 10
# 日志輸出的 Layout 定義
fastlog.appender.R2.layout = fastlog::PatternLayout
fastlog.appender.R2.layout.ConversionPattern = %D{%Y-%m-%d %H:%M:%S.%q} [%c:%R:%T]-[%5p] %m %n
5 fastlog::DailyRollingFileAppender 輸出設備
按日期自動滾動日志的 Appender 。它與上面的 RollingFileAppender 類似,不同就是時間經過一定時間段就自動滾動日志備份起來。而時間的處理又與 fastlog::DailyFileAppender 類似。
配置定義如下:
# 定義日志輸出設備為 fastlog:: DailyRollingFileAppender
fastlog.appender.R3 = fastlog::DailyRollingFileAppender
# 定義日志輸出的文件,可以帶具體路徑
fastlog.appender.R3.File = fastlog.log
# 日志文件的日期名格式,與其他日期格式化類似,詳見后面的 PatternLayout
fastlog.appender.R3.TimeFormatPattern = %Y%m%d%H
# 日志自動切分可以按如下幾種自動滾動日志
# MONTHLY( 每月 ) WEEKLY( 每周 ) DAILY( 每天 ) TWICE_DAILY( 每兩天 )
# HOURLY( 每小時 ) MINUTELY( 每分鐘 )
fastlog.appender.R3.Schedule = HOURLY
# 日志輸出的 Layout 定義
fastlog.appender.R3.layout = fastlog::PatternLayout
fastlog.appender.R3.layout.ConversionPattern = %D{%Y-%m-%d %H:%M:%S.%q} [%c:%R:%T]-[%5p] %m %n
6 fastlog::SocketAppender 輸出設備
這個比較特殊,它可以將日志輸出到某臺服務器,通過指定日志服務器的 IP/ 域名和端口。
配置定義如下:
# 定義日志輸出設備為 fastlog:: SocketAppender
fastlog.appender.R4 = fastlog::SocketAppender
# 定義日志服務器的 hostname ,此服務器的服務可以統一保存日志
fastlog.appender.R4.host = 192.168.2.1
# 日志服務器的服務端口
fastlog.appender.R4.port = 9998
# 連接超時時間,按秒
fastlog.appender.R4.TimeOut = 10
# 日志輸出的 Layout 定義
fastlog.appender.R4.layout = fastlog::PatternLayout
fastlog.appender.R4.layout.ConversionPattern = %D{%Y-%m-%d %H:%M:%S.%q} [%c:%R:%T]-[%5p] %m %n
下面介紹幾種 Layout
7 fastlog::SimpleLayout 布局器
這個非常,只是在輸出的原始日志前加個 Loglevel 和一個 ”-” ,如:
DEBUG - This is the simple formatted log message
8 fastlog::TTCCLayout 布局器
這是一種缺省的帶格式輸出的布局器,其格式由時間、線程 ID 、 Logger 和 NDC 組成( consists of time, thread, Logger and nested diagnostic context information, hence the name )。 TTCCLayout 在使用時可以選擇顯示本地時間或 GMT 時間,缺省是按照本地時間顯示。
典型輸出如下:
10-16-06 12:12:23,321 [1075298944] DEBUG log <> - this is a TTCCLayout log format
9 fastlog::PatternLayout 布局器
這是一種有詞法分析功能的模式布局器,應用最廣泛,也最強大,推薦使用,下面詳細介紹。
用戶可以根據一些定義好的標識符自定義輸出格式,如上面的例子:
# 日志輸出的 Layout 定義
fastlog.appender.R4.layout = fastlog::PatternLayout
fastlog.appender.R4.layout.ConversionPattern = %D{%Y-%m-%d %H:%M:%S.%q} [%c:%R:%T]-[%5p] %m %n
其中的 %D{%Y-%m-%d %H:%M:%S.%q} [%c:%R:%T]-[%5p] %m %n 即是一種輸出模式。
下面詳細介紹這些標識符的定義:
( 1 ) "%%" ,轉義為 % ,即 pattern = "%%" 時輸出 "%"
( 2 ) "%c" ,輸出 logger 名稱,比如 pattern ="%c" 時輸出 : "test.logger.mytest " ,也可以控制 logger 名稱的顯示層次,比如 "%c{1}" 時輸出 "test_logger" ,其中數字表示層次。
( 3 ) "%D" ,顯示本地時間,當 pattern ="%D" 時輸出 :"2006-8-10 20:55:25" , %d 顯示標準時間。還可以通過 %d{
} 定義更詳細的顯示格式,比如 %d{%H:%M:%s} 表示要顯示小時:分鐘:秒。
大括號中可顯示的預定義標識符如下:
%a 表示禮拜幾,英文縮寫形式,比如 "Fri"
%A 表示禮拜幾,比如 "Friday"
%b 表示幾月份,英文縮寫形式,比如 "Oct"
%B 表示幾月份, "October"
%c 標準的日期+時間格式,如 "Sat Oct 16 18:56:19 2006"
%d 表示今天是這個月的幾號 (1-31)"16"
%H 表示當前時刻是幾時 (0-23) ,如 "18"
%I 表示當前時刻是幾時 (1-12) ,如 "6"
%j 表示今天是哪一天 (1-366) ,如 "290"
%m 表示本月是哪一月 (1-12) ,如 "10"
%M 表示當前時刻是哪一分鐘 (0-59) ,如 "59"
%p 表示現在是上午還是下午, AM or PM
%q 表示當前時刻中毫秒部分 (0-999) ,如 "237"
%Q 表示當前時刻中帶小數的毫秒部分 (0-999.999) ,如 "430.732"
%S 表示當前時刻的多少秒 (0-59) ,如 "32"
%U 表示本周是今年的第幾個禮拜,以周日為第一天開始計算 (0-53) ,如 "41"
%w 表示禮拜幾, (0-6, 禮拜天為 0) ,如 "6"
%W 表示本周是今年的第幾個禮拜,以周一為第一天開始計算 (0-53) ,如 "41"
%x 標準的日期格式,如 "08/10/06"
%X 標準的時間格式,如 "19:02:34"
%y 兩位數的年份 (0-99) ,如 "06"
%Y 四位數的年份,如 "2006"
%Z 時區名,比如 "GMT"
( 4 ) "%F" ,輸出當前記錄器所在的文件名稱,比如 pattern ="%F" 時輸出 : "main.cpp"
( 5 ) "%L" ,輸出當前記錄器所在的文件行號,比如 pattern ="%L" 時輸出 : "51"
( 6 ) "%l" ,輸出當前記錄器所在的文件名稱和行號,比如 pattern ="%L" 時輸出 : "main.cpp:51"
( 7 ) "%m" ,輸出原始信息,比如 pattern ="%m" 時輸出 : "this a test log" 。
( 8 ) "%n" ,換行符
( 9 ) "%p" ,輸出 LogLevel ,比如 pattern ="%p" 時輸出 : "DEBUG"
( 10 ) "%R" ,輸出記錄器所在的進程 ID ,比如 pattern ="%R" 時輸出 : "567"
( 11 ) "%T" ,輸出記錄器所在的線程 ID ,比如 pattern ="%T" 時輸出 : "2332"
( 12 ) "%x" ,嵌套診斷上下文 NDC (nested diagnostic context) 輸出,從堆棧中彈出上下文信息。
( 13 )格式對齊,比如 pattern ="%-10m" 時表示左對齊,寬度是 10 ,此時會輸出 "teststr " ,當然其它的控制字符也可以相同的方式來使用,比如 "%-12d" , "%-5p" 等。
C++ 通用框架的設計 作者: naven 日期: 2006-8-10