2008-10-25 94 views
3

我目前在一家擁有大量內部定製應用程序的公司工作。目前還沒有很多標準。我想實現一種方法來記錄/跟蹤在這個程序中發生的錯誤(大部分是asp.net)。實時/生產Web應用程序中的錯誤跟蹤

我目前想在應用程序的錯誤方法處理這個在Global.asax。首先嚐試將信息保存到錯誤日誌/跟蹤數據庫,如果失敗,請嘗試發送電子郵件。

什麼類型的信息是最有用的錯誤消息和其他應用程序變量(頁,用戶名等)來獲得。

我目前想用兩個表,一個得到普遍的錯誤和應用信息的,以及第二保存異常信息。這將是一對多關係來處理可能來自一個應用程序級別異常的內部異常。

我相信,我錯過了很多細節,並想聽聽處理此問題的策略。

回答

1

傑夫阿特伍德寫了一個偉大的異常處理程序,你應該看看上CodeProject

我會試圖收集儘可能多的信息成爲可能。 堆棧信息 會話信息 定位誤差

的我也要建立一個Web服務的應用程序調用的異常信息保存關閉到系統中。

0

它實際上聽起來像你認爲解決方案很好。

我在網絡開發商店工作,所以除了記錄錯誤外,我還確保任何系統嚴重錯誤(如失敗的數據庫查詢等)也通過電子郵件發送,以便我們可以跳過並立即修復它們。

另一種可以考慮的方法是每天發送一份報告,提供有關每個應用程序中出現的每個錯誤的信息以及您希望在電子郵件中使用的任何相關信息。

我們將所有錯誤記錄到該應用程序的單個表中(當然,當您處理數據庫全部包含在內部的應用程序時更容易),包括錯誤的時間戳和也通過電子郵件發送的例外消息。

異常消息包含一個函數跟蹤,讓你知道什麼原始調用函數是以及文件和行號的堆棧中的所有功能。這使得反饋任何給定的錯誤都非常簡單。

+0

保存所有數據庫的問題是,如果錯誤是在數據庫本身,您永遠不會在日常報告中得到錯誤,導致系統無法插入它! :-) – balexandre 2008-10-25 19:27:02

0

當登錄到數據庫失敗,你可以寫到服務器的事件日誌,或到log.txt文件。您在此選擇部分取決於您是否可以訪問包含這些服務器的Web服務器。

如果您需要快速響應,發送錯誤通知電子郵件是一個好主意。但是沒有錯誤列表來掃描它們。

我這樣做是通過創建一個特殊的自定義異常類,其屬性包括用戶信息(ID,名稱,如果有的話),所有的會話變量,所有的表單變量(所以你可以看到表單是如何填充的,用戶輸入)以及錯誤發生位置(哪個頁面,哪個類,哪個方法)的堆棧跟蹤之外的某些指示。還包括調用的存儲過程的名稱和參數send或SQL本身。還有所有的Exception屬性(堆棧跟蹤等)。和DisplayMessage和InternalMessage字段。 DisplayMessage顯示給用戶。 InternalMessage記錄在日誌中,並在調試模式下顯示在自定義錯誤頁面上。

我在基頁的Page_Error中進行日誌記錄,並在Application_Error中執行失效保護。

有時我在web.config中添加一個鍵值對來包含我的電子郵件地址(或通訊組列表)。如果該密鑰中有值,則會發送通知電子郵件。如果沒有價值,則不會發送eomail。然後,在測試或早期生產期間,我可以立即收到有關該問題的個人通知。在初始階段過後,我刪除web.config中的電子郵件地址。

1

這就是我所做的,並且由於電子郵件問題,我仍然有一個錯誤。

我從來沒有在數據庫上保留任何東西,因爲如果數據庫有錯誤我不會在數據庫原因上出現這種錯誤,從邏輯上講,插入將失敗!

因此,我通過電子郵件發送給像[email protected]

主題一個特殊的電子郵件地址:[應用程序名稱] [時間戳:DDMMYYYY HHMMSS] 消息:應用程序,錯誤消息,堆棧跟蹤信息加上會話變量,如用戶名和服務器變量,如推薦人。

ASP.NET開發人員的最好的朋友是堆棧跟蹤信息,正是在這裏,你會知道哪裏出了問題,什麼是呼叫,它被調用。

您在本系統有唯一的問題,是你不會得到任何東西,如果電子郵件有問題(一些例外,在發送電子郵件時),爲此,我開始添加到每月的XML文件[ errorLog_mmm_yyyy.xml],並使用gridview加載了一個簡單的「拖放」頁面,該頁面加載了我想要檢查錯誤的月份和年份的XML。

try 
{ 
    // production code 
} 
catch(Exception ex) 
{ 
    Utilities.Mail.SendError(ex); 
} 

或最好的辦法:將它添加到的Application_Error在Global.asax中:與代碼

<%@ Application Language="C#" %> 
<%@ Import Namespace="System.Diagnostics" %> 
<script language="C#" runat="server"> 
void Application_Error(object sender, EventArgs e) 
{ 
    //get reference to the source of the exception chain 
    Exception ex = Server.GetLastError().GetBaseException(); 

    //log the details of the exception and page state to the 
    //Windows Event Log 
    EventLog.WriteEntry("myWebApplication name", 
    "MESSAGE: " + ex.Message + 
    "\nSOURCE: " + ex.Source + 
    "\nFORM: " + Request.Form.ToString() + 
    "\nQUERYSTRING: " + Request.QueryString.ToString() + 
    "\nTARGETSITE: " + ex.TargetSite + 
    "\nSTACKTRACE: " + ex.StackTrace, 
    EventLogEntryType.Error); 

    Utilities.Mail.SendError(ex); 
} 
</script> 

上面添加錯誤到事件日誌,我追加了錯誤的SendError(Exception)函數中的XML文件。

+0

這很好,假設你有權訪問服務器上的事件日誌,並且實際上記得定期查看它;-) – 2008-10-26 15:04:07

3

的作者,我認爲ELMAH可能是你在找什麼。

1

當通過https登錄潛在的機密信息時要非常小心。用戶會期望它是端對端加密的(這可能是合法的要求)。確保您不會通過普通電子郵件發送。

一般情況下我說的所有記錄,包括GET,POST,餅乾,形式狀態(ASPNET),用戶代理,其他標題,日期/時間,服務器計算機等要求的

但在某些情況下會導致一些信息被記錄下來,而您不應永久記錄信息(例如信用卡號碼被傳遞給支付提供商)。通過電子郵件發送更糟糕。

如果HTTPS處於打開狀態,則值得檢查,如果是這樣,請減少記錄的信息量以避免此問題。我只是通過一個字符串來表示該字段是空的還是非空的。

2

如果您使用日誌庫(如Log4Net),則可以設置各種日誌appender,以在代碼中進行單個日誌調用時登錄到電子郵件,數據庫,文件,事件日誌等。這post涵蓋了你需要開始的一切。

還有ASP.NET health monitoring

編輯:另一張海報提到ELMAH,這是偉大的錄製ASP.NET錯誤,並可以動態'注入'運行的應用程序。

0

我們對網站錯誤報告應用感到沮喪,因此我們在Clearwind Consulting撰寫了自己的報告。它是免費的,我們在項目內部使用它。它提供完整的錯誤信息,例如完整的錯誤代碼,瀏覽器類型,追溯,導致錯誤的代碼片段,錯誤頻率超過30天等等。在Clearwind,我們開展Web應用程序開發。我們需要一種工具,可以爲我們提供有關我們網站高效使用的真實數據。

您可以選擇如何獲取您的網站何時發生錯誤的通知。 RSS,電子郵件或任何最適合您的方法都可用於獲取錯誤通知。是的,您可以在喝酒時將錯誤發送到您的iPhone。它完全用Django編寫,因此如果您希望標記或格式化數據,則可以使用JSON,RoR,XML,CSV等。或者只是來到網站。

如果你喜歡,請看www.areciboapp.com。

它是免費的,可以輕鬆地添加到(或從中刪除)任何網站,並提供真實的信息,使您能夠修復錯誤,而不僅僅是404。只是邀請來看看,看看它可以幫助你和你的網站。我們認爲它可能。

0

這是一個不錯的主意,登錄到服務器上的自定義事件日誌以及任何其他日誌記錄&通知。如果錯誤是由基礎結構問題引起的,則同樣的問題也可能使錯誤處理程序不能發送電子郵件或保存到數據庫。