【问题标题】:ELMAH not displaying all error logs from SQL Server in elmah.axdELMAH 未在 elmah.axd 中显示来自 SQL Server 的所有错误日志
【发布时间】:2017-06-19 00:36:09
【问题描述】:

我设置 Elmah 将错误记录到 SQL Server,Web 应用程序正在将所有错误记录到数据库中,但并非所有错误都显示在 elmah.axd 中。

缺少的一些错误是:

  • System.Web.HttpUnhandledException

    _shutDownMessage=HostingEnvironment 启动关闭 HostingEnvironment 导致关闭_shutDownStack=
    在 System.Environment.GetStackTrace(异常 e,布尔需要文件信息)
    在 System.Environment.get_StackTrace()
    在 System.Web.Hosting.HostingEnvironment.InitiateShutdownInternal()....

  • System.Web.HttpException

    会话状态在此上下文中不可用。

  • _shutDownMessage=IIS 配置更改 HostingEnvironment 启动关闭 HostingEnvironment 导致关闭 CONFIG 更改_sh​​utDownStack=
    在 System.Environment.GetStackTrace(异常 e,布尔需要文件信息)
    在 System.Environment.get_StackTrace() .....

请参阅随附的屏幕截图。

如何让数据库中的所有错误出现在elmah.axd中?

当我将错误保存在文件系统中时,一切都很好,但当我移至 SQL Server 时却没有。

谢谢!

【问题讨论】:

  • 看起来您可能正在使用底部屏幕截图中的内存或文件错误记录器运行。尝试单击 elmah.axd 列表中的错误之一,复制错误 ID 并在 SQL Server 中搜索错误 ID。有吗?

标签: asp.net sql-server elmah


【解决方案1】:

如果我可以谦虚地建立在首席架构师 Atif 所说的基础上,在您的 Web.config 中,就是这个部分:

<elmah>
  <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="foo" />
</elmah>

设置为:

<elmah>
  <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="foo" applicationName="*" />
</elmah>

这将显示所有个数据库错误记录,而不是只显示与 Elmah 正在运行的应用程序名称匹配的记录。如果未提供 applicationName 属性,它只会返回与 IIS 分配的标识符匹配的记录,例如-“/LM/W3SVC/10/ROOT”。

如果您有一个纯粹用于查看环境中所有应用程序记录的 Elmah 错误的应用程序,这将非常有用。

【讨论】:

  • 我收到了Error Log for * on XXXNo errors found.。星号无法识别为通配符,在 web.config 中有设置吗?
  • 啊,看来我可能错过了对 Elmah 存储过程的关键更改:[ELMAH_GetErrorsXml] 和 [ELMAH_GetErrorXml]。在这些存储过程中,尝试将 WHERE 子句中的所有实例:[Application] = @Application 更改为:(@Application = '*' OR ([Application] = @Application))。这样,使用 applicationName="*" 作为其 Elmah 应用程序名称的应用程序将返回所有记录,而所有其他应用程序仍将返回特定于其 applicationName="MyAppName" 的记录。让我知道这是否有帮助。
  • 感谢您的澄清。我不想碰 Elmah 的代码,所以我选择使用相同的 applicationName
【解决方案2】:

我认为这是因为您有不同的应用程序名称(请参阅屏幕截图中的 Application 列),SqlErrorLog 只会显示属于您在 web.config 中配置的应用程序名称的错误(如果没有, ELMAH 将默认为 IIS 分配的标识符,例如 /LM/W3SVC/10/ROOT)。这是设计使然,因为它允许您将一个后端数据库用于多个 Web 应用程序。最好配置一个稳定且合乎逻辑的应用程序名称。如果所有这些错误都针对同一个应用程序,您可以在表上运行 UPDATE 语句以将 Application 列设置为相同的值。

【讨论】:

    【解决方案3】:

    我使用了 sqlErrorLog,只是为 sqlErrorLog 设置了 ApplicationName: 代码:

    var connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
    var sqlErrorLog = new Elmah.SqlErrorLog(connectionString);
    
    var controller = executedContext.Controller as Controller;
    if (controller != null)
        sqlErrorLog.ApplicationName = controller.Request.ServerVariables["APPL_MD_PATH"];
    var errorId = sqlErrorLog.Log(error);
    

    结果图片:

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 1970-01-01
      • 2019-01-17
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多