2009-01-04 30 views
3

在我工作的公司,我創建了一個錯誤記錄類來處理我的ASP.net應用程序中的錯誤。這是一個自定義類,因爲我們不允許在我們的服務器上安裝額外的軟件(nLog,log4net等)。要從錯誤中記錄多少信息?

我目前在我的兩個項目中使用它,並從中看到了一些好的結果。現在我正在捕獲導致頁面和應用程序錯誤的錯誤。它發送並存儲錯誤消息和所有內部異常。

我現在面臨的問題是,我收到錯誤,我不太清楚如何重現。我沒有聽到任何用戶的任何錯誤報告。我不確定他們在做什麼,或者即使他們將這些視爲錯誤。

我正在考慮在每個頁面上創建一個事件日誌,或者我想要了解更多信息。將它作爲Session變量保存在頁面上,並向它寫入事件(函數的開始/結束,變量的更改等)。然後,只有在調用錯誤時纔會發送錯誤消息,以查看是否可以更好地瞭解發生的情況。我希望這樣做不會讓所有用戶訪問應用程序時發生大量的事件日誌,只是想在一個用戶發生錯誤之前就開始工作。

你知道我應該注意什麼缺陷嗎?

您有任何建議要尋找的東西嗎?

更新:

@Saret:我understnad你在哪裏與響應快到了,我同意。我對這家公司相當陌生,仍然需要了解他們如何做事。在過去,我曾與同事談過如何擁有這款產品,或者使用這個開源項目。問題歸結爲,我們在安全系統上工作,並獲得批准以獲得這些東西需要花費大量時間,封頂和處理所有繁文red節。我會進一步研究這種情況,因爲我認爲有一個好的錯誤記錄系統非常重要,目前沒有任何東西正在被使用。

@Jim Blizard:我想盡量避免記錄/存儲所有的東西回來,找出對導致錯誤的情況很重要。我不想陷入過度的羅伯託巴羅斯關聯的文章中討論的信息。我目前的思考方法是,在每個頁面的內存中保留一個字符串,並且如果出現錯誤,則在頁面Page_Error事件中,抓住該字符串並將其附加到正在記錄的異常。這樣我只記錄發生的錯誤/異常並將錯誤存儲到事件日誌中。如果沒有任何事情發生,那麼正在創建的日誌將被放入位桶中,永遠不會再被看到。

@羅伯託巴羅斯:感謝你的鏈接,我記得在某處讀過它,但忘了保存它。

+0

請糾正我,如果我錯了,但據我所知,log4net的是一個單一的DLL和不需要安裝。 – 2009-01-04 17:29:32

回答

3

這可能不是您正在尋找的確切答案,但是爲什麼在有強大的工具(您提到)爲您處理所有這些關鍵問題時開發自己的錯誤記錄機制?

我可以欣賞你不允許安裝額外的軟件,但不會記錄庫只是類像你的自定義代碼?根本區別在哪裏?我認爲花費在實施日誌框架上的時間可能會更好地花費在倡導和制定體面的日誌記錄解決方案的商業案例上。

1

對於錯誤,我是一個記錄很多很大的粉絲。當事情出錯時,信息非常有價值。我會將整個日誌保存在一個地方(文本文件或數據庫表)中,並使用會話標識符將相關事件分組在一起。

2

我曾經爲一家代理商工作,該代理商不允許安裝任何不完全是我自己的代碼或他們(可怕的)COM對象的東西。如果你有這種類型的限制,那麼看看你是否可以獲取log4net的源代碼幷包含在你的項目中。

當談到日誌時,沒有比log4net更好的了。

1

這裏就是我喜歡記錄:

  • 錯誤/調試級別(信息,調試問題,崩潰,等...)
  • 時間
  • 描述性文本(通常一條線)
  • 堆棧跟蹤(如果可能)
  • 數據(用戶,會話,變量值,等等)

最簡單的方法是寫入一個文本文件,但它可以很好地在數據庫中。您還可以使用Windows事件日誌。有些事情要注意。嗯...你需要定期清理你的日誌。有趣的故事:有一次我們有一個記錄到數據庫的錯誤記錄器,但是我們有錯誤的數據庫憑證導致了一個錯誤,然後被記錄下來......最終從遞歸(IIRC)中獲得了堆棧溢出。

2

我個人採取了以下做法上記錄錯誤回報(且僅記錄錯誤)在asp.net應用程序:

  • 使用 protected void Application_Error(object sender, EventArgs e) { Server.Transfer("~/Support/ServerErrorSupport.aspx", true); } (我做了Server.Transfer保存後的所有數據。)

  • 生成此錯誤唯一的錯誤ID(因此可以對同一錯誤的後續支持進行分組)。該ID是一個由連接字符串計算得到的散列值,該字符串由file,method,lineNr和error.Message組成。我通過stacktrace上的正則表達式獲取文件,方法和lineNr值。

  • 我記錄所有以下數據到一個XML結構(取決於數據類型,我存儲該值不同,值類型=>的ToString(),ISerializable的=>序列,...):

    1. 計算機名:Application.Server.MachineName
    2. PhysicalRoot:Application.Server.MapPath( 「〜/」)
    3. RequestUrl:Application.Request.Url.ToString()
    4. 的applicationSettings:WebConfigurationManager.AppSettings
    5. ConnectionSettings:WebConfigurationManager.ConnectionStrings
    6. 查詢字符串:Application.Request.QueryString
    7. FormPost:Application.Request.Form
    8. 會議:Application.Session
    9. HttpHeaders:Application.Request。集管
  • 保存XML結構爲包含錯誤ID和時間戳的本地文件。 我選擇了這種做法,因爲:

    • 本地存儲它或在生產過程中在數據庫中
    • 因爲(測試/調試很容易期間)我可以郵寄的關係(XML文件)對自己文件只是一個(轉儲高清)保存錯誤報告(如服務器連接,數據庫問題等)的創建過程中可能會出錯,只要確保您有寫權限。
    • 此外,在servererrorsupport.aspx頁面上,保存xml文件後,用戶可以選擇包含額外信息並添加電子郵件地址以更新有關錯誤的進度。這會附加到xml文檔。
    • 我使用一個xslt文件格式錯誤數據(xml)在一個不錯的錯誤報告。