【问题标题】:Exception.Data info is missing in EntLib logEntLib 日志中缺少 Exception.Data 信息
【发布时间】:2010-11-20 11:14:25
【问题描述】:

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

【问题讨论】:

  • 我同意 HandleException:作为一个框架,“if rethrow”构造并没有真正提供很多抽象;您仍然需要在每个 catch 块中添加“if rethrow”代码。

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


【解决方案1】:

您不必创建自己的格式化程序。

Exception 对象的 Data IDictionary 中的每一项都被添加到 LogEntry 对象的 ExtendedProperties Dictionary 并被记录(如果由格式化程序指定)。

扩展属性:{dictionary({key} - {value})} config sn-p 应该记录扩展属性字典中的所有键/值对。如果您只想记录集合中的一项,可以使用“keyvalue”。在您的示例中,它将类似于以下内容:

Hello Key: {keyvalue(Hello)}


我修改了 ExceptionHandlingWithLoggingQuickStart 以添加 Data.Add("Hello", "World"),我在事件日志条目的末尾看到了“扩展属性:Hello - World”。所以它正在工作。

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

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


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

更新:

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

【讨论】:

  • 谢谢!你的答案是我迄今为止得到的最好的答案之一。准确,切中要害。太糟糕了,我只能给你+1,而且这个话题没有得到太多关注。你应该得到更多的。 :) 我试用了 QuickStart,甚至用示例中的配置替换了我自己的配置。然后我意识到问题出在哪里:我更新了问题,希望你也能帮我解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 2010-10-11
  • 1970-01-01
  • 2016-07-04
  • 2019-09-18
相关资源
最近更新 更多