日志級別 debug info warn eirror fatal

日志級別 debug info warn eirror fatal??

軟件中總免不了要使用諸如 Log4net, Log4j, Tracer 等東東來寫日志,不管用什么,這些東東大多是大同小異的,一般都提供了這樣5個日志級別:
??? × Debug
??? × Info
??? × Warn
??? × Error
??? × Fatal
??????? 一個等級比一個高,但是在具體開發中,關于應該如何選擇適應的等級,卻沒有找到好的文章進行說明。記錄一下自己的一些看法,以便日后使用吧。

=== Debug ===
??????? 這個級別最低的東東,一般的來說,在系統實際運行過程中,一般都是不輸出的。


??????? 因此這個級別的信息,可以隨意的使用,任何覺得有利于在調試時更詳細的了解系統運行狀態的東東,比如變量的值等等,都輸出來看看也無妨。


??????? 當然,在每一個 Debug 調用之前,一定要加上 If 判斷。

=== Info ===
??????? 這個應該用來反饋系統的當前狀態給最終用戶的,所以,在這里輸出的信息,應該對最終用戶具有實際意義,也就是最終用戶要能夠看得明白是什么意思才行。


??????? 從某種角度上說,Info 輸出的信息可以看作是軟件產品的一部分(就像那些交互界面上的文字一樣),所以需要謹慎對待,不可隨便。

=== Warn、Error、Fatal ===
??????? 警告、錯誤、嚴重錯誤,這三者應該都在系統運行時檢測到了一個不正常的狀態,他們之間的區別,要區分還真不是那么簡單的事情。我大致是這樣區分的:


??????? 所謂警告,應該是這個時候進行一些修復性的工作,應該還可以把系統恢復到正常狀態中來,系統應該可以繼續運行下去。


??????? 所謂錯誤,就是說可以進行一些修復性的工作,但無法確定系統會正常的工作下去,系統在以后的某個階段,很可能會因為當前的這個問題,導致一個無法修復的錯誤(例如宕機),但也可能一直工作到停止也不出現嚴重問題。

??????? 所謂Fatal,那就是相當嚴重的了,可以肯定這種錯誤已經無法修復,并且如果系統繼續運行下去的話,可以肯定必然會越來越亂。這時候采取的最好的措施不是試圖將系統狀態恢復到正常,而是盡可能地保留系統有效數據并停止運行。

??????? 也就是說,選擇 Warn、Error、Fatal 中的具體哪一個,是根據當前的這個問題對以后可能產生的影響而定的,如果對以后基本沒什么影響,則警告之,如果肯定是以后要出嚴重問題的了,則Fatal之,拿不準會怎么樣,則 Error 之。

=== 一些疑惑 ===
??????? 不過在實際使用中,基于上面的這種考慮,也還是有一些具體問題。最常見的就是要在最終產品中將輸出日志打開到那種級別才算好呢?


??????? 例如在應用中有一個輸出窗口,一些系統狀態信息將被輸出到這個輸出窗口中。因為 Info 的級別是如此之低,所以為了讓用戶能夠看到有效的輸出信息,必須將日志級別開放到 Info 級別。但是 Warn 的級別比 Info 要高,所以用戶不得不被迫看到一些 Warn 的信息。而我們其實已經假定,Warn 信息其實并不影響系統的正常運行,這一般只代表系統中存在一些還沒有被發現或者修改的小 Bug。這些 Warn 信息會讓最終用戶困惑甚至恐慌,系統發出警告了,該怎么辦?

??????? 個人觀點,Info 的級別應該比 Warn 更高才對,Warn 信息和 Debug 一樣,應該在產品測試和調試時使用,而 Info、Erro 以及 Fatal 則在產品發布后需要繼續使用。

??????? 目前我所采用的解決方法是,對于 Warn、Error、Fatal 都添加一個相應的系統斷言,這樣,可以保證當發生這種問題時,在調試階段,可以立即得到提示。在軟件發布以后,這些信息也能被記錄到日志文件中去。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445111.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445111.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445111.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

輸入輸出系統

I/O設備:輸入輸出和存儲功能的設備 I/O設備的分類 按傳輸的速度: 低速設備(如鍵盤、鼠標、語音輸入輸出設備) 中速設備(如行式打印機、激光打印機等) 高速設備(如磁帶機、磁盤機、光盤機等&…

vue2源碼解析---v-model雙向數據綁定

什么是v-model v-model 是 Vue 中的一個指令,用于實現表單元素與 Vue 實例中數據的雙向綁定。這意味著當表單元素的值發生變化時,Vue 實例中的數據也會隨之更新 工作原理 生成ast樹 本質上是語法糖 結合了v-bind和v-on兩個指令 示例代碼 new Vue({e…

php收集的精典代碼

1. οncοntextmenu"window.event.return&#xff06;#118aluefalse" 將徹底屏蔽鼠標右鍵 <table border οncοntextmenureturn(false)><td>no</table> 可用于Table 2. <body onselectstart"return false"> 取消選取、防止復制…

python外卷(7)--glob

glob模塊1.glob.glob()2.對比os.listdir()glob是python自帶的一個操作文件的模塊&#xff0c;可用于查找 指定路徑 中 匹配的 文件。1.glob.glob() 下面是一個測試文件路徑&#xff1a; (base) pppp-System-Product-Name:~/Desktop/test_glob$ tree . ├── a │ ├── 1…

Sublime Text 2配置強大的IDE開發環境,運行java

Sublime Text 2是我無意中發現的、據說十分強大的、便捷的編輯器&#xff0c;許多程序員都投入到Sublime Text 2的懷抱中。 1 配置java開發環境的方法如下&#xff1a; 在jdk安裝目錄下的bin文件夾下新建一個bat格式的文件&#xff0c;文件命為javacexec.bat。 如果是在Wind…

thinkphp的快捷方法實例化對象

D、F、S、C、L、A、I 他們都在functions.php這個文件家 下面我分別說明一下他們的功能 D&#xff08;&#xff09; 加載Model類 M&#xff08;&#xff09; 加載Model類 A&#xff08;&#xff09; 加載Action類 L&#xff08;&#xff09; 獲取語言定義 C&#xff08;&#xf…

Python外卷(8)--pdist, squareform

pdist, squareform1.pdist, squareform使用例子2.通過矩陣的四則運算實現上述pdist, squareformscipy.spatial.distance 距離計算庫中有兩個函數&#xff1a;pdist, squareform&#xff0c;用于計算樣本對之間的歐式距離&#xff0c;并且將樣本間距離用方陣表示出來。&#xff…

模擬進程調度

功能 data.h #ifndef _Data_h_ #define _Data_h_#include <stdio.h> #include <stdlib.h> #include <string.h>#define ElemType PCB #define Status int #define OK 1 #define ERROR 0 #define TimeSlice 1 #define Infinity 10 //INT_MAX#define NAME_M…

gdb調試多進程和多線程命令

1. 默認設置下&#xff0c;在調試多進程程序時GDB只會調試主進程。但是GDB&#xff08;>V7.0&#xff09;支持多進程的 分別以及同時 調試&#xff0c;換句話說&#xff0c;GDB可以同時調試多個程序。只需要設置follow-fork-mode(默認值&#xff1a;parent)和detach-on-fork…

python外卷(10)--取整

"取整"那些事1.python 內置函數1.1int()--向下取整1.2round()--四舍五入2.math模塊取整函數2.1 math.floor()--向下取整2.2 math.ceil()--向上取整2.3 math.modf()--分別取小數部分和整數部分3.numpy模塊取整函數3.1 numpy.floor()--向下取整3.2 numpy.ceil()--向上取…

模擬銀行家算法

介紹 data.h #ifndef _Data_h_ #define _Data_h_#include <stdio.h> #include <stdlib.h> #include <string.h>#define ElemType PCB #define Status int #define true 1 #define false 0 #define OK 1 #define ERROR 0 #define RESOURCE_NUM …

Lua 與 C混合編程 .

本文通過程序實例說明C調用lua腳本和lua調用C的方法: 先建立一個 test.c文件: #include <stdio.h> #include <stdlib.h> #include "lua.h" #include "lualib.h" #include "lauxlib.h" #pragma comment(lib, "lua5.1.lib&qu…

模擬固定分區分配

介紹 data.h #ifndef _Data_h_ #define _Data_h_#include <stdio.h> #include <stdlib.h> #include <string.h> #define LIST_INIT_SIZE 10 #define LISTINCREMENT 2 #define true 1 #define false 0 #define PCBType PCB #define Status int…

Linux下的lua和boost c++的搭建和安裝

先下載lua &#xff0c;boost c http://www.lua.org/versions.html#5.2 http://www.boost.org/ http://sourceforge.net/projects/luabind/ 1. 安裝lua [rootlocalhost ~]#tar zxvf lua-5.1.2.tar.gz -C /usr/local [rootlocalhost ~]# cd /usr/local/ [rootlocalhost lo…

模擬基本分頁存儲

介紹 data.h #ifndef _Data_h_ #define _Data_h_#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>#define LIST_INIT_SIZE 10 #define LISTINCREMENT 2 #define true 1 #define false 0 #define PCBType PC…

常用正則表達式和shell命令列表

取當前目錄下普通文件的后綴名列表&#xff1a; ls -l | awk /^-/{print $NF} |awk -F. {print $NF}|awk !/^$/ 匹配0和正整數的正則表達式&#xff08;除0以外&#xff0c;其它數字不能以0開頭&#xff09;&#xff1a; (^0$)|(^[0-9]\d*$) 匹配中文字符的正則表達式&#xff…

無限踩坑系列(7)-Latex使用Tips

Latex常用命令1.latex注釋2.圖片左邊對齊3.字母頭上加聲調4.腳注5.公式中加空格6.字體加粗體7.公式換行8.\textsuperscript{*}9.\begin{itemize}10.\operatorname{trace}11.\noindent12.\textcircled{}圓圈數字一些TIPs1.latex注釋 單行使用百分號%注釋 多行使用如下命令,在編…

在CentOS6.2下安裝DNS服務軟件Bind并快速配置簡單實例

[實踐Ok]在CentOS6.2下安裝DNS并快速配置實例&#xff0c;共八步&#xff0c;心路歷程如下&#xff1a;背景介紹&#xff1a;在日常的開發中&#xff0c;往往會在測試機和外網的Http的Url實際接口是不一樣的&#xff0c;在測試機一個Url地址&#xff0c;在外網中又是一個地址。…

模擬動態分區分配

介紹 list.h #ifndef _List_h_ #define _List_h_#include "Data.h"//******* 鏈表 *******// Status InitLinkList(LinkList *L); void PCBAssign(PCBType *e1, PCBType e2); Status GetElemt_L(LinkList L,int i,PCBType *e); Status ListIn…

python模塊(4)-Collections

collections1.collection.counter(list)2.collections.defaultdict()3.collection.dequecollections是Python內建的一個集合模塊&#xff0c;提供了許多有用的集合類。collections在python官方文檔中的解釋是High-performance container datatypes1.collection.counter(list) …