對(duì)于一個(gè)上點(diǎn)規(guī)模的C++項(xiàng)目而言,Log的作用是毋庸置疑的,出問(wèn)題的時(shí)候,看了Log,常見(jiàn)的問(wèn)題處理起來(lái)自是方便不過(guò),即使遇到麻煩的問(wèn)題,也可以從log總發(fā)現(xiàn)不少蛛絲馬跡。因此一個(gè)嚴(yán)肅的項(xiàng)目應(yīng)該從一開(kāi)始就好好考慮如何打Log,便于分析、維護(hù)。
現(xiàn)實(shí)的情況卻是很多項(xiàng)目都是從最初的數(shù)千行代碼逐步龐大起來(lái);開(kāi)始的時(shí)候可能為了圖方便,加log的方式大多是自己在iostream的基礎(chǔ)上自己封裝一下;等到項(xiàng)目擴(kuò)大數(shù)十倍的時(shí)候,卻發(fā)現(xiàn)這種方式很力不從心,Log文件凌亂復(fù)雜,難以管理。
現(xiàn)有的log工具,基本是分為兩個(gè)陣營(yíng),經(jīng)典的syslog和花哨強(qiáng)大的log4j,從而衍生出很多個(gè)變體。log4j基本已經(jīng)成為復(fù)雜應(yīng)用程序的log標(biāo)準(zhǔn)了,無(wú)奈C++的幾個(gè)模仿者確各有千秋。我的情況是:
1>不需要復(fù)雜的配置,甚至不需要配置文件,但修改log消息格式又要很方便
2>支持自動(dòng)備份功能
3>多線程安全
4>效率要盡量高
5>不要有其他依賴(lài)
log4cpp很輕易的滿(mǎn)足了我的要求,只需要用已有的RollingFileAppender準(zhǔn)備好后端,創(chuàng)建PatternLayout,一切就可以了;log級(jí)別的設(shè)置完全和syslog協(xié)議一樣,很直觀,打log地方,調(diào)用默認(rèn)的Category管理器取得一個(gè)命名的Category,其他就是簡(jiǎn)單的調(diào)用了: log(), debug(), notice(), info(), notice()....
本來(lái)最感興趣的是log4cxx, Apache的偉大項(xiàng)目,功能也最全,麻煩的是它自帶了兩個(gè)平臺(tái)庫(kù),需要額外依賴(lài);配置文件也要顯示準(zhǔn)備,感覺(jué)太臃腫了,估計(jì)大項(xiàng)目采用的吧。
效率上最高的應(yīng)該是pantheiosle了,據(jù)說(shuō)沒(méi)開(kāi)啟Log的情況下,overhead幾乎是0,作者自稱(chēng)效率是log4cxx的數(shù)倍,但也依賴(lài)于STLSoft(雖然只有頭文件),其打包方式也讓人想避而遠(yuǎn)之,還要用作者自己寫(xiě)的版本選擇器來(lái)選一個(gè)合適的庫(kù)(Win的情況)。
還有一個(gè)是Boost的logging庫(kù),用盡了模板技巧,雖然很炫,當(dāng)時(shí)沒(méi)多少用,也沒(méi)有通過(guò)boost 嚴(yán)格的review,雖然是專(zhuān)家寫(xiě)的,暫時(shí)也沒(méi)時(shí)間評(píng)估和學(xué)習(xí)了。