2009-08-18 144 views
6

如何讓異常處理應用程序塊(EHAB)從日誌中的Exception.Data屬性寫入值?EntLib日誌中缺少Exception.Data信息

try 
    { 
    // ... 
    } 
    catch (Exception ex) 
    { 
    ex.Data.Add("Hello", "World"); 
    throw ex; 
    } 

異常記錄正確,但我無法在由EHAB創建的日誌條目中的任何位置找到添加的數據。

據我所知,這是一個推薦的做法,添加額外的相關信息的例外本身就像上面的例子。這就是爲什麼我有點驚訝,EHAB默認不包括這個。

我可以通過使用EntLib文本格式化程序模板編輯器(下面的屏幕截圖)修改模板來解決此問題嗎?我找不到有關提供的各種「代幣」的任何信息,但我認爲答案隱藏在他們的某處。

Text Formatter Template Editor http://img195.imageshack.us/img195/6614/capturegmg.png

或者我真的需要實現自己的自定義文本格式化做到這一點?

編輯/ UPDATE:

我爲了避免到處添加HandleException方法調用在我的代碼做這在我的Global.asax.cs:

using EntLib = Microsoft.Practices.EnterpriseLibrary; 
using System; 

namespace MyApp 
{ 
    public class Global : System.Web.HttpApplication 
    { 
    protected void Application_Error(object sender, EventArgs e) 
    { 
     // I have an "All Exceptions" policy in place... 
     EntLib.ExceptionHandling.ExceptionPolicy.HandleException(Server.GetLastError(), "All Exceptions"); 
     // I believe it's the GetLastError that's somehow returning a "lessor" exception 
    } 
    } 
} 

原來這是一樣的(這工作得很好,而且基本上解決了我的問題):

try 
{ 
    // ... 
} 
catch (Exception ex) 
{ 
    ex.Data.Add("Hello", "World"); 
    bool rethrow = ExceptionPolicy.HandleException(ex, "Log Only Policy"); 
    throw ex; 
} 

通過所有的代碼,並添加try-catch的HandleException調用似乎......好吧,愚蠢的。 我想我的問題真的是如何使用正確的EHAB,而不是配置。

任何關於我如何才能的建議在ASP.NET Web應用程序的「全局級別」上記錄所有異常?

+0

我同意HandleException:作爲一個框架,「if rethrow」構造並不真正提供很多抽象;你仍然需要在每個catch塊中添加「if rethrow」代碼。 – 2009-08-18 15:32:26

回答

7

您不應該創建自己的格式化程序。

Exception對象上的Data IDictionary中的每個項目都被添加到LogEntry對象的ExtendedProperties Dictionary中並被記錄(如果由格式化程序指定)。

擴展屬性:{dictionary({key} - {value})} config snippet應記錄擴展屬性字典中的所有鍵/值對。如果你想從集合中只記錄一個項目,你可以使用「keyvalue」。在您的例子這將是沿着線的東西:

Hello Key: {keyvalue(Hello)} 


我修改了ExceptionHandlingWithLoggingQuickStart添加Data.Add(「你好」,「世界」),我看到「擴展屬性:你好 - 世界」在事件日誌條目的末尾。所以它正在工作。

如果您沒有看到這種行爲,你需要確保:

  • 與添加的數據項的例外傳遞給ExceptionPolicy。HandleException
  • ,在HandleException方法中指定的策略配置在配置
  • 與LoggingExceptionHandler日誌記錄是在LoggingConfiguration指定的格式被配置成支持ExtendedProperties


如果可以的話看看問題出在哪裏,試着比較一下你在QuickStart中的內容。如果它仍然無法工作,請發佈您的代碼和您的配置。

UPDATE:

如果你要處理的Application_Error在Global.asax那麼您將收到一個HttpUnhandledException,因爲頁面沒處理錯誤。您可以使用InnerException屬性檢索您感興趣的異常; InnerException將包含原始異常(除非它在該異常的InnerException :)中)。或者,您可以使用Server.GetLastError().GetBaseException()來檢索是根本原因的異常。

+0

謝謝!你的答案是迄今爲止我所得到的最好的答案之一。精確和重點。太糟糕了,我只能給你+1,這個話題並沒有得到太多的關注。你應得更多。 :) 我試用了QuickStart,甚至用示例中的配置替換了我自己的配置。然後我意識到問題所在:我更新了這個問題,我希望你也能幫助我解決這個問題。 – 2009-08-18 14:26:05