EntLib日志中缺少Exception.Data信息

时间:2009-08-18 03:21:28

标签: c# .net logging exception-handling enterprise-library

如何让异常处理应用程序块(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应用程序中“全局级别”的所有异常的任何建议吗?

1 个答案:

答案 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”。它正在发挥作用。

如果您没有看到这种行为,则需要确保:

  • 将添加了数据项的异常传递给ExceptionPolicy.HandleException
  • HandleException方法中指定的策略配置为使用配置中的LoggingExceptionHandler进行日志记录
  • 将LoggingConfiguration中指定的格式化程序配置为支持ExtendedProperties


如果您无法看到问题所在,请尝试将您的内容与QuickStart中的内容进行比较。如果它仍然无效,请发布您的代码和配置。

<强>更新

如果要在global.asax中处理Application_Error,那么由于页面没有处理错误,您将收到HttpUnhandledException。您可以使用InnerException属性检索您感兴趣的Exception; InnerException将包含原始的Exception(除非它在该异常的InnerException :))。或者,您可以使用Server.GetLastError().GetBaseException()来检索作为根本原因的异常。