如何让异常处理应用程序块(EHAB)从日志中的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
或者我是否真的需要实现自己的自定义文本格式化来完成此任务?
修改/更新:
我在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应用程序中“全局级别”的所有异常的任何建议吗?
答案 0 :(得分:7)
您不必创建自己的格式化程序。
Exception对象的Data IDictionary中的每个项目都被添加到LogEntry对象的ExtendedProperties Dictionary中并被记录(如果由格式化程序指定)。
扩展属性:{dictionary({key} - {value})}配置代码段应记录扩展属性字典中的所有键/值对。如果您只想从集合中记录一个项目,可以使用“keyvalue”。在你的例子中,它将是:
Hello Key: {keyvalue(Hello)}
我修改了ExceptionHandlingWithLoggingQuickStart以添加Data.Add(“Hello”,“World”),我在Event Log条目的末尾看到“Extended Properties:Hello - World”。它正在发挥作用。
如果您没有看到这种行为,则需要确保:
如果您无法看到问题所在,请尝试将您的内容与QuickStart中的内容进行比较。如果它仍然无效,请发布您的代码和配置。
<强>更新强>
如果要在global.asax中处理Application_Error,那么由于页面没有处理错误,您将收到HttpUnhandledException
。您可以使用InnerException属性检索您感兴趣的Exception; InnerException将包含原始的Exception(除非它在该异常的InnerException :))。或者,您可以使用Server.GetLastError().GetBaseException()
来检索作为根本原因的异常。