将异常的ELMAH错误序列号(不是GUID)传递给ASP.NET中的自定义错误页面

时间:2010-12-09 12:06:44

标签: asp.net exception-handling elmah

我想显示异常的序列号(来自ELMAH_Error表中的序列号列),而不是每当发生错误时显示给用户的GUID。这可能吗?我找到了这篇文章Problem passing ELMAH log id to Custom Error page in ASP.NET,但它给出了GUID,我想知道如何在ELMAH组件的Logged事件中访问序列号?提前谢谢。

2 个答案:

答案 0 :(得分:1)

在这里开箱即用,没有亲自尝试过。

你必须对elmah的来源做一些修改并编译你自己的小版本的Elmah。如果您将Elmah配置为在其他位置记录,我不确定是否使用了序列列。这些是我认为您需要采取的步骤,可能特定于SQL服务器日志记录:

  1. 为Elmah.ErrorLogEntry类型添加属性以获取序列值
  2. 更改ELMAH_LogError存储过程,以便返回插入到序列列中的值。序列列定义为标识列,因此SQL Server会在插入时自动生成此列的值。
  3. 更改Elmah.SqlErrorLog.GetError方法中的代码,使其获取存储过程返回的序列值,并将其放入您添加到ErrorLogEntry类型的属性中。

答案 1 :(得分:1)

一些背景......

ELMAH旨在将错误记录到指定的日志源。最常见的日志源是SqlErrorLog类,它将错误记录到SQL Server数据库,并且是核心ELMAH库的一部分。但是还有其他日志源可用于将错误记录到电子邮件地址,XML文件,Oracle数据库等等。

您引用的序列号是SqlErrorLog类特有的。如果您查看其他一些日志源,例如XmlFileErrorLog,您将看到没有序列号的概念。

鉴于此,ELMAH的Error类 - 代表错误 - 没有Sequence属性也就不足为奇了。 “序列”是SqlErrorLog日志源特有的。 (如果检查用于为SqlErrorLog日志源创建数据库对象的T-SQL脚本,则可以进一步查看此内容 - Sequence字段是IDENTITY列,因此会自动计算由插入数据库。它不是ELMAH提供的值。)

可能的解决方案......

MichaelvR建议修改ELMAH的源代码,但我建议不要这样做,因为这样做会将你的ELMAH分支绑定到特定的日志源。相反,也许是一个不那么优雅(和更简单!)的解决方案:

  1. 如您所述,在ErrorLog_Logged中创建Global.asax事件处理程序,
  2. 读取刚刚引发的错误的错误Id值(GUID),
  3. 连接到数据库并直接查询ELMAH_Error表。
  4. 以下是一个示例查询:

    SELECT Sequence
    FROM ELMAH_Error
    WHERE ErrorId = TheErrorIdOfTheJustLoggedError
    

    您如何看待这种解决方法?

    快乐编程!