ELMAH未在ASP.NET MVC 2中记录日志

4

我无法弄清楚我在这里做错了什么,尝试在我的MVC 2应用程序中使用ELMAH,但它从未记录任何内容。

以下是我在web.config中的内容(相关部分)

<sectionGroup name="elmah">
  <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
  <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
  <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
  <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
</sectionGroup>

<elmah>
  <security allowRemoteAccess="0" />
  <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="ELMAH.SqlServer" />
  <!-- 
  <errorMail from="youremail@example.com" to="youremail@example.com" cc="" subject="Elmah Error" async="true" smtpPort="25" smtpServer="[EmailServerName]" userName="" password="" />
  <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data" />
  -->
</elmah>


<connectionStrings>
  ...
  <add
      name="ELMAH.SqlServer"
      connectionString="data source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ELMAH_Logging.mdf;Integrated Security=SSPI;Connect Timeout=30;User Instance=True;"
      providerName="System.Data.SqlClient"/>
</connectionStrings>  

<system.Web>
   <httpHandlers>
      <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
      ...
    </httpHandlers>
    <httpModules>
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
      ...
    </httpModules>
</system.Web>



<system.webServer>
   <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
    </modules>
    <handlers>
      <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah"/>
      ...
    </handlers>
</system.webServer>

使用来自DotNetDarren.com的代码,但无论我做什么,都不会记录任何异常?


你的控制器中是否使用了HandleError属性?这通常会阻止ELMAH记录异常。 - UpTheCreek
不,我不是这样做的,我正在按照我提供的链接中所说的方式进行操作。我非常困惑,至少可以这么说。 - PsychoCoder
3个回答

5

如果 Elmah 无法记录错误,它将悄无声息地失败...请重新检查 Elmah 使用的所有连接字符串,您可能会在那里看到问题。

以下是用于创建数据库表的表脚本:

CREATE TABLE [dbo].[ELMAH_Error](
    [ErrorId] [uniqueidentifier] NOT NULL,
    [Application] [nvarchar](60) NOT NULL,
    [Host] [nvarchar](50) NOT NULL,
    [Type] [nvarchar](100) NOT NULL,
    [Source] [nvarchar](60) NOT NULL,
    [Message] [nvarchar](500) NOT NULL,
    [User] [nvarchar](50) NOT NULL,
    [StatusCode] [int] NOT NULL,
    [TimeUtc] [datetime] NOT NULL,
    [Sequence] [int] IDENTITY(1,1) NOT NULL,
    [AllXml] [varchar](max) NOT NULL,
 CONSTRAINT [PK_ELMAH_Error] PRIMARY KEY NONCLUSTERED 
(
    [ErrorId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[ELMAH_Error] ADD  CONSTRAINT [DF_ELMAH_Error_ErrorId]  DEFAULT (newid()) FOR [ErrorId]

非常感谢!我从未考虑过确保我的连接字符串正确,因为我不知道它无法记录错误时会默默失败。 - PsychoCoder

0

我不确定这是否能帮到你,但我刚刚在我的网站中尝试将ELMAH整合进去时遇到了同样的问题。首先,我甚至看不到错误屏幕,其次,一旦我解决了这个问题,就没有任何错误被报告。这两个问题都是由于system.WebServer中缺少的部分引起的。我正在使用一个MVC3.0网站(最近从2.0转换而来)。我真正能够看到我的配置和你的唯一区别是,在你的handlers部分的system.WebServer中没有preCondition="integratedMode"(请参见下文)。也许这是导致你出现问题的原因?

<handlers>
   <add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
</handlers>

编辑

非常抱歉我的原始想法没有帮到你 - 还有一些想法:

  1. 您下载的 ELMAH 版本是哪个(x86 还是 x64?)以及您正在构建哪个版本的 CPU?您是否尝试将构建 CPU 设置为您下载的相同版本。
  2. 您在 global.asax 中是否有任何 "OnError" 处理程序?如果有,如果您删除它会发生什么?
  3. 最后,您是否尝试构建一个仅包含 ELMAH 的空 MVC 项目,以确保您可以正确记录该项目。

谢谢你的建议,我尝试了,但仍然无法在ELMAH日志记录中实现。这真的让我疯狂了,这应该是很容易实现的。 - PsychoCoder

0

我必须重申Paul的前置条件,但我也在每个条目的模块部分下使用了preCondition="managedHandler"

我还在elmah的安全组下使用了allowRemoteAccess="1",但我锁定了路径,只有管理员级别的经过身份验证的用户可以通过控制器调用访问该页面。

我注意到XML错误日志条目被注释掉了。它是否通过XML模式与SQL一样有效?我知道当我刚开始时,由于连接字符串和数据库模式问题,我不得不在XML模式下工作。

您也可能会遇到完全/中等信任问题,具体取决于部署情况,但我认为您会从elmah中获得异常。您尝试查看机器上的事件日志了吗?这也帮助我解决了设置它时遇到的成长烦恼。

最后,我刚刚注意到他们1月14日的更改日志中有这个内容:http://code.google.com/p/elmah/source/detail?r=782指向ELMAH-过滤404错误,它仅仅说明ErrorFilter模块需要在注册时放在最后,才能按预期运行。你没有粘贴过滤器配置参数,所以我怀疑它是否适用,但是注册事项的顺序显然很重要,也许存在一些关联。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接