如何让异常处理应用程序 block (EHAB) 将 Exception.Data 属性的值写入日志?
try
{
// ...
}
catch (Exception ex)
{
ex.Data.Add("Hello", "World");
throw ex;
}
异常记录正确,但我在 EHAB 创建的日志条目中的任何地方都找不到添加的数据。
据我所知,推荐的做法是向异常本身添加额外的相关信息,如上例所示。这就是为什么我对 EHAB 默认不包含它感到有点惊讶。
我可以通过使用 EntLib 文本格式化程序模板编辑器(下面的屏幕截图)修改模板来解决这个问题吗?我找不到有关提供的各种“ token ”的任何信息,但我认为答案隐藏在它们的某个地方。
Text Formatter Template Editor http://img195.imageshack.us/img195/6614/capturegmg.png
或者我真的需要实现我自己的自定义文本格式化程序来完成这个吗?
编辑/更新:
我在我的 Global.asax.cs 中这样做是为了避免在我的代码中的任何地方添加 HandleException 方法调用:
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;
}
遍历所有代码并添加带有 HandleException 调用的 try-catch 似乎……好吧,愚蠢。 我想我的问题确实是如何正确使用 EHAB,而不是配置。
关于如何在 ASP.NET Web 应用程序中正确记录“全局级别”的所有异常有什么建议吗?
最佳答案
您不必创建自己的格式化程序。
Exception 对象的 Data IDictionary 中的每一项都被添加到 LogEntry 对象的 ExtendedProperties Dictionary 中并被记录(如果由格式化程序指定)。
Extended Properties:{dictionary({key} - {value})} 配置片段应该记录扩展属性字典中的所有键/值对。如果你只想记录集合中的一项,你可以使用“键值”。在您的示例中,它类似于:
Hello Key: {keyvalue(Hello)}
我修改了 ExceptionHandlingWithLoggingQuickStart 以添加 Data.Add("Hello", "World") 并且我在事件日志条目的末尾看到“扩展属性:Hello - World”。所以它正在工作。
如果您没有看到这种行为,您需要确保:
- 添加了数据项的异常被传递到 ExceptionPolicy.HandleException
- HandleException 方法中指定的策略配置为使用配置中的 LoggingExceptionHandler 进行日志记录
- LoggingConfiguration 中指定的格式化程序配置为支持 ExtendedProperties
如果您看不出问题出在哪里,请尝试将您拥有的内容与 QuickStart 中的内容进行比较。如果仍然无法正常工作,请发布您的代码和配置。
更新:
如果您打算在 global.asax 中处理 Application_Error,那么您将收到一个 HttpUnhandledException
,因为页面没有处理该错误。您可以使用 InnerException 属性检索您感兴趣的异常; InnerException 将包含原始异常(除非它在该异常的 InnerException 中 :))。或者,您可以使用 Server.GetLastError().GetBaseException()
检索作为根本原因的异常。
关于c# - 异常。EntLib 日志中缺少数据信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1291619/