C# 异常。EntLib日志中缺少数据信息

C# 异常。EntLib日志中缺少数据信息,c#,.net,logging,exception-handling,enterprise-library,C#,.net,Logging,Exception Handling,Enterprise Library,如何让异常处理应用程序块(EHAB)在日志中写入Exception.Data属性中的值 try { // ... } catch (Exception ex) { ex.Data.Add("Hello", "World"); throw ex; } 异常记录正确,但我在EHAB创建的日志条目中找不到添加的数据 据我所知,建议向异常本身添加额外的相关信息,如上面的示例所示。这就是为什么我有点惊讶EHAB默认不包括这个 我可以通过使用EntLib文本

如何让异常处理应用程序块(EHAB)在日志中写入Exception.Data属性中的值

  try
  {
    // ...
  }
  catch (Exception ex)
  {
    ex.Data.Add("Hello", "World");
    throw ex;
  }
异常记录正确,但我在EHAB创建的日志条目中找不到添加的数据

据我所知,建议向异常本身添加额外的相关信息,如上面的示例所示。这就是为什么我有点惊讶EHAB默认不包括这个

我可以通过使用EntLib文本格式化程序模板编辑器(下面的屏幕截图)修改模板来修复此问题吗?我找不到关于提供的各种“代币”的任何信息,但我认为答案隐藏在它们的某个地方

或者我真的需要实现我自己的自定义文本格式化程序来实现这一点吗

编辑/更新:

我在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
    }
  }
}
事实证明,这与此不同(这很好,基本上解决了我的问题):

浏览所有代码,并通过HandleException调用添加TryCatch似乎。。。好吧,笨蛋。 我想我真正的问题是如何正确使用EHAB,而不是配置


关于如何在ASP.NET web应用程序的“全局级别”上正确记录所有异常的任何建议???

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

Exception对象上的Data IDictionary中的每个项都被添加到LogEntry对象的ExtendedProperties字典中,并被记录(如果格式化程序指定)

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

Hello Key: {keyvalue(Hello)}

我修改了ExceptionHandlingWithLoggingQuickStart来添加数据。添加(“Hello”、“World”),我在事件日志条目的末尾看到了“ExtendedProperties:Hello-World”。因此,它正在发挥作用

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

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

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

更新:


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

谢谢!你的答案是我迄今为止得到的最好的答案之一。精确而中肯。很遗憾,我只能给你+1,而且这个话题没有得到太多关注。你应该得到更多。:)我尝试了QuickStart,甚至用示例中的配置替换了我自己的配置。然后我意识到问题是什么:我更新了问题,我希望你也能帮我解决这个问题。我同意HandleException:作为一个框架,“if rethrow”结构并没有提供很多抽象;您仍然需要在每个catch块中添加“if rethrow”代码。
Hello Key: {keyvalue(Hello)}