2008-10-11 118 views
8

我目前正在開發一個相當大的多層應用程序,將部署在海外。雖然我希望它一旦被解體後不會崩潰或爆炸,但我不能100%確定這一點。因此,如果知道我可以請求日誌文件,找出出錯的原因以及原因,那就太好了。記錄,什麼時候和什麼?

因此,基本上如標題所示,我想知道何時以及要記錄什麼?我想知道這一點,以確保我有全面的日誌文件,可以輕鬆檢查,以確定如果我的應用程序崩潰發生了什麼。

回答

6

1 - 使用標準格式製作一個日誌。這並不重要,但要確保每次進入都具有相同的基本領域。只是調用「printf」可能不會削減它(替換System.err.println或任何適當的)

2 - 允許至少一個字段是一個任意字符串...開發人員會更好地知道你有什麼需要在那裏。

3 - 在每個條目中包含高分辨率時間戳。你最終會需要它,相信我。

4 - 如果可能,請包含錯誤來源的文件和行號。這在C中很容易,而且在Java中有點痛苦。但是它很難用以後會有用,特別是當人們開始剪切+粘貼代碼時,包括錯誤信息。

5 - 確保日誌位於任何級別的代碼可以使用它的地方。

6 - 我經常使用「主要」和「次要」錯誤標籤,其中「主要」是指「我是檢測到有問題的人」,而「次要」是指「我稱爲功能其中報告了錯誤「。這樣可以很容易地找到問題的根源(「主要:找不到文件」),並仍然報告錯誤的含義(「次要:無法加載校準表」)。

7 - 包含一些記錄非錯誤和錯誤的功能。

我發現最難的部分是錯誤不一定是錯誤。如果你用一個文件調用一個函數,並且該文件不存在,是否應該記錄一個錯誤或者不是?有時候這是一個嚴重的失敗,有時是預期的。它基本上取決於函數的API;如果該函數有辦法返回一個錯誤,我通常會這樣做,而不需要記錄;那麼上層代碼的工作就是決定是否需要報告該錯誤或者是否有預期的錯誤。

0

只要您不必爲績效付出太多,採伐就很重要。

根據我的經驗,您想要記錄的最重要的事情是那些警告,糟糕的,完整性檢查失敗,雨天的情景等,在編寫晴天情景時往往會忽略,有時會放棄他們關閉打印「我們不應該到這裏」等等。這些東西有傾向於在測試期間不出現,但在部署期間開始彈出,當然他們沒有被捕獲。

如果您記錄並打算通過遠程讀取結果,請確保捕獲確切的時間戳,位置和某種類型的會話標識(以防多個實例同時運行並寫入日誌文件)。您越容易確定哪些消息是一次執行的一部分,那麼您就越好。

錯誤級別和類型也很重要。進行搜索以確保不會從多個位置寫入相同的消息或跟蹤將很困難也很重要。

最後,如果您的用戶運行Mac OS X,請注意記錄錯誤:出於某種奇怪的原因,即使在Leopard中,默認日誌記錄機制的處理成本高昂,並且可能會浪費大量CPU。

6

首先,抓住自己的日誌框架 - 你沒有提到任何特定的語言,但基於Apache log4j的任何框架都是安全的。最重要的是框架支持不同級別的冗長(調試消息,警告,錯誤消息)。您可以在運行時對記錄器進行配置,以確定哪些消息將實際寫入,以及在哪裏 - 重新發明輪盤以記錄日誌沒有意義。

在你的源代碼中實現你的日誌框架。至少,您應該考慮記錄,然後對應用程序中可能發生的異常「增值」。將堆棧跟蹤寫入日誌文件非常好,但很少能夠診斷問題 - 請考慮記錄方法參數的值。

在更高層次上,您可以利用不同冗長級別的強大功能來記錄應用程序中發生了什麼。如果錯誤只發生在無法連接遠程調試器的生產系統上,那麼這種方法特別有用 - 您只需提高日誌框架配置文件中的詳細級別,並觀察所有調試(「調用帶參數的方法X Y「)消息出現在日誌中。

1

我只想爲一個大型關鍵任務應用程序添加一小部分,只有部署後才能調查問題,通過客戶端發送的日誌幫助您瞭解何時何地登錄隨着應用程序的成熟與時間的延長(成熟度直接與應用程序在一個地方部署和使用的時間量以及它[在不同的客戶端/位置]上的不同部署次數)有關。

0

我們開發了一個全球範圍內使用的基於電話的大型系統,並且多年來一直使用我們自己的日誌記錄系統。調試級別非常重要,我們的應用程序隨調試設置爲「僅限錯誤」一起提供,並且在除時間敏感以外的所有時間啓用日誌文件。我們還支持將輸出轉移到調試跟蹤系統(這是Windows,所以這是對OutputDebugString的簡單調用,我們的工程師可以訪問調試捕獲器,稱爲DBWIN32)。這很重要,因爲某些類的錯誤要求您能夠看到多個應用程序的輸出,這些應用程序是序列化的。我已經通過應用這種技術解決了一些非常棘手的多應用程序交互錯誤。應用程序通常會在輸出中添加一個可讀的標籤,以便我們可以知道哪個行來自哪個應用程序。

我們使用的級別通常是:關閉,僅錯誤,基本,詳細,「詳細」(其中verbose是一個佔位符,暗示諸如輪詢結果,用戶操作,消息內容等多重事物 - 無論作者認爲重要) 。

哦,應用程序寫入其日誌文件的第一件事是提供其版本資源的頭文件,因此我們可以告訴我們正在處理的構建 - 不要相信用戶或本地工程師知道: - )

0

AOP對於非侵入式日誌記錄非常有用。例如,您可以使用AOP記錄每個方法調用的參數值和返回值,而不實際將日誌記錄語句添加到每個方法。

如何做到這一點的具體細節顯然取決於你的目標語言和平臺(你沒有指定)。有關如何將此類記錄程序添加到基於Java Spring的應用程序的示例,請參閱here

相關問題