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

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

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

  try
  {
    // ...
  }
  catch (Exception ex)
  {
    ex.Data.Add("Hello", "World");
    throw ex;
  }

异常记录正确,但我在 EHAB 创建的日志条目中的任何地方都找不到添加的数据。

据我所知,推荐的做法是向异常本身添加额外的相关信息,如上例所示。这就是为什么我对 EHAB 默认不包含它感到有点惊讶。

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

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 应用程序中正确记录“全局级别”的所有异常有什么建议吗?

最佳答案

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

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

Extended Properties:{dictionary({key} - {value})} 配置片段应该记录扩展属性字典中的所有键/值对。如果你只想记录集合中的一项,你可以使用“键值”。在您的示例中,它类似于:

Hello Key: {keyvalue(Hello)}


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

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

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


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

更新:

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

关于c# - 异常。EntLib 日志中缺少数据信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1291619/

相关文章:

c# - 运行 WCF 服务显示目录列表而不是服务

c# - Web.config 生产环境性能 - 最佳实践

c# - 在什么假设下 Re-Sharper 会向我显示 "Use implicitly typed local variable"消息?

c# - 如何用数组搜索数组?

ASP.NET MVC 异常日志记录

python - 如何在我的代码中传递全局调试标志变量;我应该使用 argparse 吗?

C# 生产服务器,我收集垃圾吗?

c# - 解析字符串并创建字典

C# 音频库(具有简单的效果、回声、混响...)

python - 登录 mod_python/apache