這是一篇外文,介紹了日志的使用,觀點(diǎn)也許有些偏激,但是還是有一定道理的。原文地址
最近Stack Overflow上有個(gè)帖子討論了一個(gè)程序員的日志風(fēng)格,里面提到了他的日志風(fēng)格:
INFO 級別
- 打印方法的開始和結(jié)束log
- 打印重要的循環(huán)的開始和結(jié)束log
- 打印重要的case/switch語句的開始(進(jìn)入)log
DEBUG 級別
- 打印傳入方法中的參數(shù)
- 打印(數(shù)據(jù)庫等)查詢結(jié)果集的行數(shù)
- 打印傳遞給方法是可能包含某些不確切數(shù)據(jù)的數(shù)據(jù)記錄
- 打印任何“生成的”文件路徑,連接字符串,或者其他在特定環(huán)境中被拼接起來的值
ERROR Level
- 打印異常的處理
- 無效的登錄行為 (特別是一些故意為之的安全問題)
- 在不應(yīng)該出現(xiàn)的地方出現(xiàn)的打印log,可以幫助生成不良數(shù)據(jù)報(bào)告
FATAL 級別
- 未能處理的異常,一般需要停止程序運(yùn)行等.
我并非有意把這個(gè)作者曝光這是作者,但是他確實(shí)有點(diǎn)過了...
雖然我自己不是logger的重度患者,但是我在Stack Overflow上的一個(gè)隊(duì)友就是,因此在我們建立Stack Overflow時(shí),我們使用了 log4net,并在各個(gè)層次上記錄了一堆信息。我絕對不會(huì)成為這種做法的粉絲的,因?yàn)槲夷苷f出這種做法的種種害處。
誠然logging是有某種誘人的魅力的,為什么不多多益善呢?即使您今天不打算使用它,但是誰知道,它可能對明天的故障排除很有用。哎呀,只需記錄一切!它可能會(huì)受到什
么傷害?
哦,是的,日志看起來似乎沒有害處,但讓我告訴你,它可能會(huì)造成一些嚴(yán)重的傷害。我們遇到了一個(gè)特別討厭的遞歸日志記錄bug:
- 在線程#1, 我們的代碼正在執(zhí)行Log (lock) / DB stuff (lock)
- 在線程#2, 我們的代碼正在執(zhí)行 DB stuff (lock) / log stuff (lock)
如果這些事情在負(fù)載較重的情況下發(fā)生,這會(huì)導(dǎo)致 - 你猜對了 - 這是一種傳統(tǒng)的無序死鎖情況。我不確定你會(huì)在輕負(fù)載很小的應(yīng)用中看到它,但在我們的網(wǎng)站上,平均每天發(fā)生>一次。
我不怪怪這個(gè)log4net,我怪我們的蹩腳代碼。我們花了幾天時(shí)間解決這些死鎖問題,等待它.. 添加更多日志記錄!這自然會(huì)使問題變得更糟,甚至更難以弄清楚。我們最終>被迫采取內(nèi)存轉(zhuǎn)儲(chǔ)并使用>轉(zhuǎn)儲(chǔ)分析工具。在Greg Varveris的慷慨幫助下,我們終于找到了罪魁禍?zhǔn)祝何覀兊牟煞ゲ呗?。多么諷刺。我的意思>是真正的諷刺,而不是假Alanis Morrissette那種。
雖然我是一個(gè)非常信任日志記錄異常的人,但我從來沒有成為“讓我們記錄所有可能的東西”這種感覺的重度logging患者:
- Logging意味著更多的代碼. 如果您使用的是像log4net這樣的傳統(tǒng)日志框架,則每個(gè)記錄的事件都至少有一行代碼。記錄越多,代碼越大。這是一個(gè)嚴(yán)重的問題,因?yàn)?a target="_blank" rel="nofollow">代>碼是敵人??梢娙罩敬a很混亂 - 就像過多的評論一樣,它會(huì)主動(dòng)掩蓋在應(yīng)用程序中做實(shí)際工作的代碼。
- Logging可不是免費(fèi)的. 大多數(shù)日志記錄框架相當(dāng)高效,但它們速度并不是很快。您寫入磁盤的每個(gè)日志行都會(huì)對應(yīng)用程序造成總體性能成本。如果您正在解剖復(fù)雜的對象>以將它們放入日志中,這也可能非常棘手; 這需要額外的時(shí)間。
-
值得保持到日志文件中的內(nèi)容,也應(yīng)該顯示在用戶界面上. 這是一個(gè)悖論:如果你記錄的信息非常有價(jià)值,它應(yīng)該在應(yīng)用程序本身中出現(xiàn),而不是隱藏在某個(gè)匿名日志文件
中,即使只是為了管理員。日志文件往往是有用的數(shù)據(jù)最后積灰的地方,然后就沒有然后了。 - 你打印的日志越多,你能找到的有用信息就越少 記錄足夠多的東西,最終你的日志就會(huì)變得非常雜亂,沒有人能找到任何東西。把自己埋在一堆日志數(shù)據(jù)中很容易。天哪>,這還是日志嗎,你要知道每臺(tái)計(jì)算機(jī)天生就能產(chǎn)生任何人一輩子都讀不完的日志數(shù)據(jù)。也就是說,過度的日志打印本身就是一種巨大的開支,因?yàn)槟阋獡]霍巨大的腦力要理解它>。不要和我說你的Logger工具有多好,你要在上千M的字節(jié)里面找到有用的Debug信息,求你了,別再裝逼了。
-
日志文件多數(shù)情況下并不能給你帶來及時(shí)準(zhǔn)確的信息 如果你足夠幸運(yùn),是可以讓團(tuán)隊(duì)里面的每個(gè)開發(fā)者對FATAL、ERROR、DEBUG、INFO以及其他一些日志級別形成統(tǒng)一認(rèn)識
。如果你只打算logging那些連環(huán)殺人兇手和殺人魔王之類的問題,那么,你的日志文件里面并不會(huì)有太多有價(jià)值的“罪證”,多數(shù)情況,看日志文件會(huì)你感到無聊。
那么,按你這么說,logging不就是在浪費(fèi)時(shí)間嗎?我確信很多朋友會(huì)讀到這里,并且這么認(rèn)為,不管我寫得怎么樣。平心而論,我可不是Logging的反對者,我只是反對濫>用Logging。和其他工具包一樣,如果你使用得當(dāng),它們確實(shí)可以幫你創(chuàng)建更好的程序。Logging的問題不在于日志本身,而是那個(gè)誘人的OCD“日志中多一點(diǎn),再多一點(diǎn)數(shù)據(jù)“的陷
阱,程序員在執(zhí)行日志是會(huì)陷入其中。不管怎么樣,Logging是為了幫助我們理解運(yùn)行時(shí)的問題,如果它又變成了另外一個(gè)巨大的困擾,那難道不是一種恥辱嘛!
后來,我們在StackOverflow上完全移除了各類Logging文件,僅僅依靠Exception來記錄異常情況。老實(shí)說,我一點(diǎn)都不想念那些Logging,哪怕是一小會(huì)兒時(shí)間,因?yàn)橐幌氲剿?gt;我就會(huì)想到一個(gè)絕大的日志文件在等著我來診斷問題。
總歸來說,正確的答案肯定不是“越多越好”。堅(jiān)決抵制用日志來記錄一切的傾向。從一些小而簡單的事情開始,只記錄那些最明顯和最關(guān)鍵的錯(cuò)誤。只有通過特定的、可驗(yàn)證>的需求,才能添加更多日志記錄。