自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

正確分析異常:如何讓我們打一手好Log

開發(fā) 項(xiàng)目管理 前端
為什么說Log重要呢?因?yàn)樯暇€項(xiàng)目不允許你調(diào)試,你只能通過Log來分析問題。這時打一手好Log的重要性絕不亞于寫一手好代碼。項(xiàng)目出問題時,你要能拿出Log證明自己負(fù)責(zé)的部分沒有問題,如果是自己的問題,要從Log里快速找出錯誤原因。

如果項(xiàng)目上過線的話,那你一定知道Log是多么重要。

為什么說Log重要呢?因?yàn)樯暇€項(xiàng)目不允許你調(diào)試,你只能通過Log來分析問題。這時打一手好Log的重要性絕不亞于寫一手好代碼。項(xiàng)目出問題時,你要能拿出Log證明自己負(fù)責(zé)的部分沒有問題,如果是自己的問題,要從Log里快速找出錯誤原因。如果沒有從Log里找出錯誤原因,那一定是一件很悲催的事情,特別是在bug不容易重現(xiàn)的情況下。那簡直就是叫天天不靈,叫地地不應(yīng)啊。

一.Log級別

Log最常用的級別就是DEBUG,INFO,WARN,ERROR,其他的很少用。如何運(yùn)用合適的Log級別也是非常重要的,在不該用ERROR的地方用了ERROR,可能會給你帶來額外的麻煩。下邊僅根據(jù)自己的使用習(xí)慣,分別說一下我對各種級別的理解。

1.ERROR:

ERROR是錯誤的意思,但不代表出現(xiàn)異常的地方就該打ERROR。我認(rèn)為ERROR是相對程序正確運(yùn)行來說的,如果出現(xiàn)了ERROR那就代表出問題了,開發(fā)人員必須要查一下原因,或許是程序問題,或許是環(huán)境問題,或許是理論上不該出錯的地方出錯了??傊?,如果你覺得某個地方出問題時需要解決,就打ERROR,如果不需要解決就不要打ERROR。

舉例來說,如果有一個接口。調(diào)用者傳過來的參數(shù)不在你的接受范圍內(nèi),在這種情況下你不能打ERROR,因?yàn)閭魇裁粗凳怯脩魶Q定的,并不影響程序正確運(yùn)行。想象一下,如果你的服務(wù)器上有監(jiān)控程序的話,檢測到ERROR或WARN就報警,參數(shù)錯誤你也打ERROR,那運(yùn)維人員會瘋掉的。

如果做一個對講機(jī),在解析語音數(shù)據(jù)包時出錯了,那就要打ERROR了,因?yàn)檫@個是理論上不該出錯的地方,要不就是你的解析代碼有問題,要不就是開發(fā)人員在拼湊語音包時存在問題,這個時候需要你來找出問題的原因。所以應(yīng)該打ERROR。

2.WARN:

WARN是指出現(xiàn)了不影響程序正確運(yùn)行的問題,WARN也是問題但不影響程序正常運(yùn)行,如果WARN出現(xiàn)的過于頻繁或次數(shù)太多,那就代表你要檢查一下程序或環(huán)境或依賴程序是否真的出問題了。

假如你訪問一個接口,設(shè)置了一個超時,超時之后會拋異常,你在try塊里不該打ERROR也不該打INFO來無視它,這時你應(yīng)該打WARN,緊緊是警告一下,如果超時過多那就該檢查一下了,是不是對方接口有問題了或者是網(wǎng)絡(luò)環(huán)境出問題了。

3.INFO和DEBUG:

ERROR和WARN是指有問題,而INFO和DEBUG就是指一般的信息了。在程序出問題時,如果這條log可以幫助你分析問題或查看程序的運(yùn)行情況,那就應(yīng)該打個INFO。如果僅僅是為了在調(diào)試階段查看程序是否運(yùn)行正確那就要打DEBUG。前邊討論的接口參數(shù)錯誤問題,就應(yīng)該打個INFO了,調(diào)用者說你的接口總是返回錯誤代碼,你可以告訴他,是他的哪個參數(shù)傳錯了。

二.如何打

1.log必備信息

在每一條log中都要將時間、類名及函數(shù)名,可以的話將行號也打印出來(不建議手寫行號),像java的log4j就是不錯的。

2.函數(shù)開始結(jié)束處

在重要函數(shù)的開始結(jié)束出應(yīng)該打上log ,這樣在看log時會比較直觀,什么時候開始什么時候結(jié)束就會一目了然,萬一中間出異常導(dǎo)致程序退出了,也知道是在哪個函數(shù)突然中斷的。也同樣適用于一個重要邏輯塊的開始結(jié)束。

3.返回結(jié)果

盡量在重要函數(shù)或web接口的每個返回分支打印返回結(jié)果。在出現(xiàn)不好分析的異常時,從細(xì)節(jié)下手,這時log會派上用場。如果跟合作方在數(shù)據(jù)方面出現(xiàn)爭議也可以及時拿出證據(jù)。

4.添加Exception異常的捕獲

如果你在代碼中捕獲了某種異常,那你要在try塊后添加Exception的捕獲,以防出現(xiàn)運(yùn)行時異常中斷程序。

5.務(wù)必打印堆棧信息

在異常捕獲代碼中務(wù)必要將堆棧信息打印出來,否則打了那么多的log可能會功虧一簣。

6.多線程的log

在多線程的程序中,log***要標(biāo)記thredId,否則可能不知道是哪個線程的作業(yè),也無法有條理的來觀察一個線程。

7.成功失敗標(biāo)志

如果某個函數(shù)是做一件比較關(guān)鍵的事情,那么這件事情成功還是失敗了,要打印log,否則關(guān)鍵事件運(yùn)行結(jié)果如何都拿不出證據(jù)的話,實(shí)在是不能讓人信服。

8.前后log的關(guān)系

如果是web程序或接口,那log就不是按照你預(yù)定的順序出現(xiàn)的,可能是好幾個響應(yīng)的log穿插在一起的。代碼里如果有幾條log前后存在一定的數(shù)據(jù)關(guān)系,那么要將這幾條log的關(guān)聯(lián)信息打出來,用來確定是針對同一個響應(yīng)的。如果沒有明確的標(biāo)志,很難說后邊的log跟前邊的log是同一個響應(yīng)或者是針對同一條數(shù)據(jù)。

9.關(guān)于耗時

訪問一個第三方接口、上傳下載文件等可能耗時的操作,都要記錄完成這個操作所耗的時間。否則程序性能出了問題,你不知道是網(wǎng)絡(luò)原因呢,還是你調(diào)用的第三方接口性能出現(xiàn)問題呢,還是你自己程序的問題呢。

10.關(guān)于數(shù)量

涉及到數(shù)量的操作要打印log,比如查詢數(shù)據(jù)庫和批量拷貝文件、上傳下載、批量格式轉(zhuǎn)換等批量操作,設(shè)計(jì)到的數(shù)量要打印出來。

總之,打log的目的是為了迅速排錯或在有爭議時拿出證據(jù)證明自己。基于這個目的,log不在多,只要抓住一切對自己有利的信息,就可以了。

想起其他的再繼續(xù)補(bǔ)充吧,歡迎大家拍磚補(bǔ)充。

本人學(xué)識尚淺,寫文目的是為了得到大家指點(diǎn)。 倘若文章幫到了您,那真是好極了。

原文鏈接:http://www.cnblogs.com/luguo3000/p/3543487.html

責(zé)任編輯:林師授 來源: 博客園
相關(guān)推薦

2023-07-16 22:57:38

代碼場景業(yè)務(wù)

2019-10-24 15:23:04

SQL優(yōu)化數(shù)據(jù)庫

2023-11-10 16:08:23

SQL數(shù)據(jù)庫

2019-12-16 14:04:48

MySQL數(shù)據(jù)庫SQL

2020-05-22 08:24:21

SQLMySQL數(shù)據(jù)庫

2011-06-24 14:48:08

英特爾網(wǎng)卡

2023-08-24 21:49:54

人工智能高端算法工程師

2022-07-10 23:15:46

Go語言內(nèi)存

2017-07-04 09:49:36

ActivityAndroidLife場景

2010-09-09 15:21:17

丁磊

2021-11-04 06:58:31

CSS性能設(shè)備

2022-08-30 13:48:16

LinuxMySQL內(nèi)存

2022-02-24 12:54:00

技術(shù)架構(gòu)碼農(nóng)

2014-04-29 10:44:50

驅(qū)動開發(fā)開發(fā)

2010-01-05 10:15:34

2022-03-31 18:59:43

數(shù)據(jù)庫InnoDBMySQL

2021-08-27 07:06:10

IOJava抽象

2021-12-29 08:27:05

ByteBuffer磁盤服務(wù)器

2022-03-08 17:52:58

TCP格式IP

2023-09-03 18:44:50

AI運(yùn)營商
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號