2010-06-07 109 views
13

我希望能夠在每個catch塊中進行日誌記錄。像這樣的東西。如何在文件中記錄異常?

catch (Exception exception) 
{ 
    Logger.Write(exception); 
} 

然後配置中的設置將使用客戶偵聽器來獲取Message和StackTrace屬性等。

我想使用企業庫日誌記錄應用程序塊。我肯定有人肯定已經做到了。

回答

31

其他人已經發布了一些關於獲取日誌應用程序塊(LAB)工作的良好鏈接,所以我不會在此重複。

在格式化你的例外條款,你有3個選擇,我能想到的:

  1. 使用默認Exception.ToString()實現(這不是壞)
  2. 編寫自定義格式化整合進入實驗室。
  3. 編寫一個幫助函數,執行格式化並將字符串傳遞給Write方法。

如果選項1不符合您的需要,那麼我會建議去選項3(因爲選項2是矯枉過正)。

一個簡單例子是這樣的:

catch (Exception exception) 
    { 
     Logger.Write(LogHelper.CreateExceptionString(exception)); 
    } 

    ... 

    public static string CreateExceptionString(Exception e) 
    { 
     StringBuilder sb = new StringBuilder(); 
     CreateExceptionString(sb, e, String.Empty); 

     return sb.ToString(); 
    } 

    private static void CreateExceptionString(StringBuilder sb, Exception e, string indent) 
    { 
     if (indent == null) 
     { 
      indent = String.Empty; 
     } 
     else if (indent.Length > 0) 
     { 
      sb.AppendFormat("{0}Inner ", indent); 
     } 

     sb.AppendFormat("Exception Found:\n{0}Type: {1}", indent, e.GetType().FullName); 
     sb.AppendFormat("\n{0}Message: {1}", indent, e.Message); 
     sb.AppendFormat("\n{0}Source: {1}", indent, e.Source); 
     sb.AppendFormat("\n{0}Stacktrace: {1}", indent, e.StackTrace); 

     if (e.InnerException != null) 
     { 
      sb.Append("\n"); 
      CreateExceptionString(sb, e.InnerException, indent + " "); 
     } 
    } 
+0

包含異常類型的名稱也很有幫助。但其他方面相當不錯。 – 2010-06-07 17:19:01

+1

@Andrew:是的,或者你可以添加一些代碼從Data屬性中提取IDictionary。 – 2010-06-07 18:18:38

+0

[Here](http://www.aspsnippets.com/Articles/Create-simple-Error-Log-Text-File-in-ASPNet-using-C-and-VBNet.aspx)是另一個**解決方案** 。希望有幫助。 – stom 2016-12-21 12:43:02

0

您需要爲文本文件添加適當的偵聽器 - 請參閱this後,它適用於ASP.NET,但配置文件在各應用程序中的工作方式相同。

+0

我可以做些什麼來直接傳遞異常對象,這樣它給人詳細的堆棧跟蹤這將有助於調試。 – IsmailS 2010-06-07 13:04:29

4

微軟已經在這個位置提供廣泛指導:Developing Applications Using the Logging Application Block

這是很值得與他們說什麼,因爲它是相當強大的熟悉自己。

如果你想要的東西多一點腳踏實地,這篇博客文章中提供了一些工作的例子:How To Configure and Use the Logging Application Block

如果你還在讀那些後遇到問題,有什麼更具體的細節編輯您的帖子似乎是問題所在。

+0

我可以做些什麼來直接傳遞異常對象,以便它提供詳細的堆棧跟蹤等,這將有助於調試? – IsmailS 2010-06-07 13:06:57

+0

您可以創建一個非常簡單的方法和/或string.format模板,然後在調用Logger.Write時使用它。 – 2010-06-07 13:30:48

+0

配置鏈接直接進入廣告。 – sweetfa 2016-08-12 03:29:08

1

@iSid這就是你所要求的

public static void printException(Exception ex){ 
       Console.WriteLine("HelpLink = {0}", ex.HelpLink); 
       Console.WriteLine("Message = {0}", ex.Message); 
       Console.WriteLine("Source = {0}", ex.Source); 
       Console.WriteLine("StackTrace = {0}", ex.StackTrace); 
       Console.WriteLine("TargetSite = {0}", ex.TargetSite); 

      }