代码之家  ›  专栏  ›  技术社区  ›  Jakob Gade

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

  •  6
  • Jakob Gade  · 技术社区  · 15 年前

    如何让异常处理应用程序块(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

    编辑/更新:

    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;
    }
    

    EHAB正确,而不是配置。

    你有什么建议吗 正确地 在ASP.NET web应用程序的“全局级别”上记录所有异常??

    1 回复  |  直到 15 年前
        1
  •  7
  •   Randy Levy    12 年前

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

    扩展属性:{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 Server.GetLastError().GetBaseException()