2008-11-17 82 views
15

很多時候,我看到了這樣的錯誤日誌記錄:記錄錯誤的最佳做法是什麼?

System.out.println("Method aMethod with parameters a:"+a+" b: "+b); 
print("Error in line 88"); 

所以..什麼是記錄一個錯誤的最佳做法?

編輯:

這是Java,但可能是C/C++,BASIC等

回答

8

的Apache共享日誌記錄不用於應用一般記錄。它旨在被不希望強制API用戶的日誌實施的庫或API使用。

Commons Logging也存在類加載問題。

選擇其中一個[許多]日誌API,使用最廣泛的可能是log4jJava Logging API

如果您想要實現獨立性,您可能需要考慮由log4j的原作者SLF4J

挑選了一個實現,然後使用該實現中的日誌級別/嚴重性一致,以便搜索/篩選日誌更容易。

+0

這些通常具有高級功能,如自動記錄源和按等級或起始位置過濾。這使得調試更容易。使用其中之一! (也檢查鏈鋸) – 2008-11-17 17:19:25

0

真的是用於記錄一個錯誤沒有最好的做法。它基本上只需要遵循一致的模式(在軟件/公司/等),提供足夠的信息來追蹤問題。例如,您可能要跟蹤的時間,方法,參數,調用方法等

只要你不只是打印「錯誤」

2

最簡單的方法登錄一個錯誤一致的格式是使用Log4j等日誌框架(假設您使用的是Java)。在您的代碼標準中包含一個日誌記錄部分以確保所有開發人員知道需要記錄什麼是非常有用的。大多數日誌框架的好處在於它們具有不同的日誌記錄級別,因此您可以控制日誌在開發,測試和生產之間的詳細情況。

2

最好的做法是使用的java.util.logging框架

然後你就可以在這兩種格式的日誌消息

log.warning(".."); 
log.fine(".."); 
log.finer(".."); 
log.finest(".."); 

或者

log.log(Level.WARNING, "blah blah blah", e); 

然後你可以使用一個logging.properties(下面的例子)在日誌級別之間進行切換,並執行各種聰明的事情,如登錄文件,旋轉等。

handlers = java.util.logging.ConsoleHandler 

.level = WARNING 

java.util.logging.ConsoleHandler.level = ALL 

com.example.blah = FINE 
com.example.testcomponents = FINEST 

在我看來應該避免像log4j和其他框架,Java已經擁有了你所需要的一切。

編輯

這可以適用作爲任何編程語言的通用做法。能夠控制來自單個屬性文件的所有日誌級別在企業應用程序中通常非常重要。

2

一些建議的最佳實踐

  • 使用日誌框架。這將允許您:

    • 輕鬆更改日誌消息的目的地基於嚴重性
    • 過濾日誌消息
    • 支持國際化的日誌消息
  • 如果您使用的是Java,那麼slf4j現在優先於Jakarta commons logging作爲伐木立面。

  • 如前所述,slf4j是一個外觀,你必須選擇一個基礎實現。 log4j,java.util.logging或'simple'。

  • 按照你的框架的建議,以確保expensive logging operations沒有不必要進行

0

上面提到的apache通用日誌API是一個很好的資源。回到java,還有一個標準的錯誤輸出流(System.err)。

直接從Java API:

此流已打開並準備 接受輸出數據。

通常,此流對應於 顯示輸出或其他輸出 由主機 指定的目標環境或用戶。按照慣例, 此輸出流用於顯示 錯誤消息或其它信息 應來立即 關注用戶的即使 主要輸出流,的 變量out的值,已被重定向 到一般不會持續監控的文件或其他目標。

22

直接登錄到控制檯是可怕的,坦率地說,一個沒有經驗的開發人員的標誌。做這種事情的唯一原因是1)他或她沒有意識到其他方法,和/或2)開發人員沒有想到將他/她的代碼部署到生產站點時會發生什麼,以及這個應用程序將如何維護。處理記錄1GB /天或更多完全不需要的調試日誌記錄的應用程序令人生氣。

普遍接受的最佳做法是使用一個日誌框架具有的概念:

  1. 不同的日誌對象 - 不同的類/模塊/等,可以登錄到不同的記錄器,這樣你就可以選擇應用不同的日誌配置到應用程序的不同部分。
  2. 不同的日誌級別 - 所以你可以調整日誌配置,只記錄生產中的錯誤,在開發環境中記錄各種調試和跟蹤信息等。
  3. 不同的日誌輸出 - 框架應該允許你配置其中日誌輸出發送到,而不需要對代碼庫進行任何更改。不同地方的一些例子,你可能想日誌輸出發送到是文件,在文件根據日期/大小,數據庫,電子郵件,遠程水槽等
  4. 日誌框架不應永遠從未拋出捲來自日誌代碼的任何異常或錯誤。您的應用程序不應該無法加載或無法啓動,因爲日誌框架無法創建日誌文件或獲取文件上的鎖定(除非這是一個關鍵要求,也許出於法律原因,對於您的應用程序)。

您將使用的最終日誌框架當然取決於您的平臺。一些常見的選項:

0
從技術考慮

除了其他的答案最好是日誌有意義的消息也許還有一些步驟,以避免未來的錯誤。當然,這取決於錯誤。

當消息指出「無法從文件X中讀取,您沒有相應的權限」時,您可能會從I/O錯誤中獲得更多。

查看更多關於SOsearch the web的例子。

相關問題