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

淺談日志系統(tǒng)在軟件程序中的重要性

開發(fā) 開發(fā)工具
日志系統(tǒng)在軟件程序中占有非常重要的地位,日志文件是排查程序問題的主要工具,是程序調(diào)試的利器。日志編寫的總體原則是簡單清晰、便于排查問題。作為一名合格的軟件開發(fā)工程師,一定要學(xué)會日志函數(shù)的靈活調(diào)用及準(zhǔn)確通過日志文件來定位程序問題。

如果世界上有一個人能夠保證一次寫出來的代碼是百分之百正確的,那么毫無疑問,他一定是世界上最優(yōu)秀的程序員,沒有之一。為什么要求代碼寫好過后要進(jìn)行充分的自測 ( 包括單元測試和集成測試 ) ?就因?yàn)槭侨私詴稿e,使程序就會有 bug 。作為一名軟件開發(fā)人員,必須要學(xué)會對程序進(jìn)行測試,也就是要學(xué)會程序的調(diào)試。

[[193830]]

代碼調(diào)試方法

一般而言,對代碼的調(diào)試有以下幾種方法:

第一,憑肉眼看 。在開發(fā)階段,我們編寫的每一行代碼都需要用我們的“火眼金睛”多審查幾遍。如果要問,最好的代碼調(diào)試工具是什么?我認(rèn)為是人眼。不管是代碼還是文檔,在用工具檢查之前,都需要先過了我們眼睛這一關(guān)。

第二,對代碼進(jìn)行編譯,以發(fā)現(xiàn)語法錯誤 。編譯器能夠幫助我們發(fā)現(xiàn)代碼中存在的語法錯誤,但對于那些隱蔽性的錯誤 ( 如邏輯錯誤等 ) 無能為力。

第三,用代碼檢查工具 ( 如 Pclint 等 ) 來走查代碼 。如果代碼編譯通過,并不表示它就沒有問題了。在學(xué)校的時候,我們一般認(rèn)為只要程序能夠運(yùn)行就可以了。但在實(shí)際的軟件開發(fā)項(xiàng)目中,程序能夠跑起來,只是“萬里長征走完了第一步”。用代碼檢查工具可以發(fā)現(xiàn)很多編譯器無法發(fā)現(xiàn)的錯誤,如變量定義了未引用、不同數(shù)據(jù)類型之間相互賦值、函數(shù)未聲明便被調(diào)用等。

第四,對代碼進(jìn)行調(diào)試 。對于運(yùn)行正常而輸出結(jié)果不正確的程序,我們可以用設(shè)置斷點(diǎn)并進(jìn)行單步跟蹤調(diào)試的方法來發(fā)現(xiàn)其中存在的問題。例如,在 VC++ 6.0 里面,可實(shí)現(xiàn)對代碼的單步調(diào)試,并輸出變量在某一步產(chǎn)生的值,可據(jù)此判斷程序的邏輯的正確與否。

第五,對程序的日志文件進(jìn)行分析 。對代碼的單步調(diào)試只在代碼行數(shù)較少的時候比較適用,如學(xué)校教材上面的程序。但在實(shí)際的軟件項(xiàng)目中,代碼少則幾千行,多則數(shù)萬行,用單步調(diào)試的方法顯然不恰當(dāng)。為了跟蹤某一變量值的變化,用該方法可能要花費(fèi)幾個小時,這對工作效率產(chǎn)生了嚴(yán)重影響。為了解決大程序文件代碼調(diào)試問題,日志系統(tǒng)應(yīng)運(yùn)而生。在程序中的重要地方打印日志,之后對產(chǎn)生的日志進(jìn)行分析,可找到對應(yīng)代碼的問題。因此,日志文件分析成了大型軟件項(xiàng)目中代碼調(diào)試的主要手段。

什么是日志文件?

看過電視劇《神探狄仁杰》的朋友可能都會對狄仁杰的斷案能力極為嘆服,他會將一個外人看來非常詭異的案件查得水落石出,連武則天都不得不說他是“神乎其技”。實(shí)際上,狄仁杰也是凡人,他只是通過極為細(xì)小的線索來順藤摸瓜發(fā)現(xiàn)幕后的黑手。對應(yīng)到軟件開發(fā)上,很多厲害的程序員都是通過分析程序運(yùn)行過程中產(chǎn)生的少量的異常日志來發(fā)現(xiàn)軟件問題的。因此,程序日志就像斷案線索一樣重要。

在業(yè)務(wù)軟件系統(tǒng)中大量使用日志,日志能夠起到“按圖索驥”的作用,它對于故障定位和系統(tǒng)正常運(yùn)行維護(hù)具有舉足輕重的作用。

日志文件是程序中寫日志函數(shù)產(chǎn)生的記錄程序執(zhí)行情況的文件。寫日志函數(shù)可以用多種編程語言編寫,可以像普通的函數(shù)一樣被調(diào)用。在恰當(dāng)?shù)牡胤秸{(diào)用該函數(shù),可對整個程序的運(yùn)行狀況有一個全面的了解,方便對程序的跟蹤調(diào)試。

日志等級

事有輕重緩急,日志信息也有重要與不重要之分。一般按照重要程度,將日志等級分為幾類。在作者參與過的軟件開發(fā)項(xiàng)目中,共有 7 個等級,用宏定義表示如下:

  • // 日志等級定義
  • #define LOG_FATAL (int)1 // 嚴(yán)重錯誤
  • #define LOG_ERROR (int)2 // 一般錯誤
  • #define LOG_WARN (int)3 // 警告信息
  • #define LOG_INFO (int)4 // 一般信息
  • #define LOG_TRACE (int)5 // 跟蹤信息
  • #define LOG_DEBUG (int)6 // 調(diào)試信息
  • #define LOG_ALL (int)7 // 全部

開發(fā)人員根據(jù)所要打印的日志的具體情況采用不同的日志等級。

日志配置

由于不同產(chǎn)品程序行數(shù)、部署情況、實(shí)現(xiàn)功能等的差別,對日志打印的要求也不盡相同,因此需要有配置來控制日志的產(chǎn)生數(shù)量和顯示情況。

例如,在筆者所參與的開發(fā)項(xiàng)目的配置文件中,有一個專門的 [LOG] 配置段,其中的配置項(xiàng)如下:

  • [ LOG ]
  • ; 日志等級 , 0-Fatal 1-Error 2-Warn 3-Info 4-Trace 5-Debug 6-All
  • LogLevel =
  • ; 每個日志文件的最大容量
  • LogMaxSize =
  • ; 是否輸出該條日志在代碼中的行數(shù) , 1-Yes 0-No
  • LogPosition =

其中, LogLevel 用于控制打印日志的等級,代碼中日志等級比配置值大的日志信息均不在日志文件中顯示; LogMaxSize 用于控制生成一個日志文件的大小的上限,超過該值后,便重新生成文件; LogPosition 用于控制是否在日志文件中顯示代碼行數(shù),方便將日志與代碼對應(yīng)起來。

日志函數(shù)的調(diào)用

日志函數(shù)的調(diào)用遵循一般函數(shù)的調(diào)用規(guī)則。例如,在筆者所參與的開發(fā)項(xiàng)目中,有兩類寫日志函數(shù),如下所示:

(1) 第一類形如: WriteLog(LogLevel, LogInfo) 。其中,參數(shù) LogLevel 指日志等級 ( 見第 2 節(jié)中的說明 ) ;參數(shù) LogInfo 是具體要打印的日志信息,我們據(jù)此信息來檢查程序的運(yùn)行情況。該函數(shù)的調(diào)用示例如: WriteLog(LOG_INFO, "The value of this integer is 3.") ,日志等級為 LOG_INFO ,日志信息為“ The value of this integer is 3. ” ( 該信息會輸出到日志文件中 ) 。

(2) 第二類形如: WriteLogEx(LogLevel, LogInfo, ParaInfo) 。這是擴(kuò)展的日志函數(shù),不但能夠輸出日志信息,還能夠在日志信息中顯示變量的值。該函數(shù)的調(diào)用示例如: WriteLogEx(LOG_INFO, "The value of integer iInt is %d.", iInt) ,該日志要輸出整型變量 iInt 的值,可以將該函數(shù)的調(diào)用與 printf 函數(shù)的調(diào)用比較起來看 ( 可以認(rèn)為 WriteLogEx 函數(shù)只是在 printf 函數(shù)中增加了一個日志等級參數(shù) ) 。

日志編寫基本原則

1) 顯式輸出,關(guān)鍵信息必須輸出;

2) 在編碼時使用正確的日志級別, error 錯誤和 warning 錯誤必須反應(yīng)出實(shí)在的含義,不是特別嚴(yán)重的問題不能將日志等級定義為 LOG_FATAL ;

3) 在寫日志描述時,要使用正常簡單易懂的語言,不能使用晦澀難懂的語言或某些專業(yè)術(shù)語;

4) 在極少數(shù)特殊情況不希望用戶知道時,可使用特殊日志標(biāo)記;

5) 為了寫出優(yōu)美的代碼,在自己修改或添加代碼的地方,都要正確的打上標(biāo)記 ( 包括作者、日期信息等 ) ,方便追蹤版本的演進(jìn)情況。

日志編寫基本要求

1) 分多條信息分別輸出,不要企圖一次將所有信息打印出來;

2) 分時輸出;

3) 必須分日志級別,這樣可根據(jù)等級迅速對日志進(jìn)行分析;

4) 控制日志信息的條數(shù),不重要的信息盡量不要打印日志。

輸出日志位置要求

1) 所有的輸入輸出,包括收消息和發(fā)消息都要求輸出日志;

2) 關(guān)鍵控制點(diǎn)必須輸出日志;

3) 調(diào)用底層或第三方軟件,必須輸出日志,而且對不可靠底層,必須加上 begin/end 兩行日志;

4) 對方系統(tǒng)處理時間必須輸出日志,以利以后維護(hù)時快速定位性能問題。

一些注意事項(xiàng)

1) 在編寫日志時需要注重日志細(xì)節(jié),目標(biāo)是為了方便以后維護(hù),在遇到問題時,可以快速定位問題;

2) 不要在同一行中寫意思重復(fù)的日志;

3) 日志需要足夠的精簡,不要隨意換行;

4) 日志中字段之間可以用空格或其它符號分?jǐn)啵荒軐⑷罩疽恢边B續(xù)而不將其分?jǐn)?,盡量使日志本身具備進(jìn)行“識文斷句”的能力;

5) 對于日志中的特殊信息 (如會話號、 IP 地址等) ,用特殊的符號進(jìn)行標(biāo)識,其主要目的是為了便于搜索。

總結(jié)

日志系統(tǒng)在軟件程序中占有非常重要的地位,日志文件是排查程序問題的主要工具,是程序調(diào)試的利器。日志編寫的總體原則是簡單清晰、便于排查問題。作為一名合格的軟件開發(fā)工程師,一定要學(xué)會日志函數(shù)的靈活調(diào)用及準(zhǔn)確通過日志文件來定位程序問題。

“實(shí)踐出真知”,只有通過不斷的積累和總結(jié),才會對日志有更全面的認(rèn)識。

【本文是51CTO專欄作者周兆熊的原創(chuàng)文章,作者微信公眾號:周氏邏輯(logiczhou)】

 

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2011-07-05 18:30:44

站內(nèi)優(yōu)化

2021-12-20 11:02:13

勒索軟件攻擊網(wǎng)絡(luò)安全

2019-08-26 15:06:13

域名系統(tǒng)DNS

2020-08-26 10:42:15

IIoT智能工廠工業(yè)物聯(lián)網(wǎng)

2015-06-02 13:10:55

2014-04-23 11:36:29

運(yùn)維日志

2009-12-25 15:00:48

WPF軟件

2009-08-05 15:26:23

需求分析

2023-02-10 10:58:41

智慧城市數(shù)據(jù)隱私

2023-05-24 16:08:45

深度學(xué)習(xí)工業(yè)4.0

2022-08-26 15:54:34

云原生Kubernetes物聯(lián)網(wǎng)

2020-09-22 16:26:46

云計(jì)算

2009-03-24 09:05:54

資源管理IT管理廣通信達(dá)

2021-12-08 14:02:46

小數(shù)據(jù)機(jī)器學(xué)習(xí)人工智能

2023-09-04 09:00:00

機(jī)器學(xué)習(xí)算法

2023-04-13 15:46:16

PoE供電PoE設(shè)備

2016-12-19 13:18:19

思科

2024-03-04 16:20:24

2011-08-04 09:50:46

2023-12-20 14:10:53

點(diǎn)贊
收藏

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