Elmah系统错误记录管理工具

ELMAH(Error Logging Modules and Handlers for ASP.NET )是一款ASP.NET下的系统错误记录管理工具,它可以非常方便的把“黄屏”错误记录到XML,MS SQLServer,SQLite,MySql等文件中,甚至它还可以发送邮件。

官方网站:http://code.google.com/p/elmah/

这是个开源的组件,可以非常方便的对网站全局进行错误报告 。

本文以SqlServer为例.首先创建数据库结构:

代码
/* 错误管理工具 SQL代码 */
CREATE TABLE dbo.ELMAH_Error
(
ErrorId
UNIQUEIDENTIFIER NOT NULL,
Application
NVARCHAR(60) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
Host
NVARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
Type
NVARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
Source
NVARCHAR(60) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
Message
NVARCHAR(500) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[User] NVARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
StatusCode
INT NOT NULL,
TimeUtc
DATETIME NOT NULL,
Sequence
INT IDENTITY (1, 1) NOT NULL,
AllXml
NTEXT COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
)
ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ALTER TABLE dbo.ELMAH_Error WITH NOCHECK ADD
CONSTRAINT PK_ELMAH_Error PRIMARY KEY NONCLUSTERED
(
ErrorId
)
ON [PRIMARY]
GO

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

CREATE NONCLUSTERED INDEX IX_ELMAH_Error_App_Time_Seq ON dbo.ELMAH_Error
(
[Application] ASC,
[TimeUtc] DESC,
[Sequence] DESC
)
ON [PRIMARY]
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

CREATE PROCEDURE dbo.ELMAH_GetErrorXml
(
@Application NVARCHAR(60),
@ErrorId UNIQUEIDENTIFIER
)
AS

SET NOCOUNT ON

SELECT
AllXml
FROM
ELMAH_Error
WHERE
ErrorId
= @ErrorId
AND
Application
= @Application



GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

CREATE PROCEDURE dbo.ELMAH_GetErrorsXml
(
@Application NVARCHAR(60),
@PageIndex INT = 0,
@PageSize INT = 15,
@TotalCount INT OUTPUT
)
AS

SET NOCOUNT ON

DECLARE @FirstTimeUTC DateTime
DECLARE @FirstSequence int
DECLARE @StartRow int
DECLARE @StartRowIndex int

-- Get the ID of the first error for the requested page

SET @StartRowIndex = @PageIndex * @PageSize + 1
SET ROWCOUNT @StartRowIndex

SELECT
@FirstTimeUTC = TimeUTC,
@FirstSequence = Sequence
FROM
ELMAH_Error
WHERE
Application
= @Application
ORDER BY
TimeUTC
DESC,
Sequence
DESC

-- Now set the row count to the requested page size and get
--
all records below it for the pertaining application.

SET ROWCOUNT @PageSize

SELECT
@TotalCount = COUNT(1)
FROM
ELMAH_Error
WHERE
Application
= @Application

SELECT
errorId,
application,
host,
type,
source,
message,
[user],
statusCode,
CONVERT(VARCHAR(50), TimeUtc, 126) + 'Z' time
FROM
ELMAH_Error error
WHERE
Application
= @Application
AND
TimeUTC
<= @FirstTimeUTC
AND
Sequence
<= @FirstSequence
ORDER BY
TimeUTC
DESC,
Sequence
DESC
FOR
XML AUTO

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

CREATE PROCEDURE dbo.ELMAH_LogError
(
@ErrorId UNIQUEIDENTIFIER,
@Application NVARCHAR(60),
@Host NVARCHAR(30),
@Type NVARCHAR(100),
@Source NVARCHAR(60),
@Message NVARCHAR(500),
@User NVARCHAR(50),
@AllXml NTEXT,
@StatusCode INT,
@TimeUtc DATETIME
)
AS

SET NOCOUNT ON

INSERT
INTO
ELMAH_Error
(
ErrorId,
Application,
Host,
Type,
Source,
Message,
[User],
AllXml,
StatusCode,
TimeUtc
)
VALUES
(
@ErrorId,
@Application,
@Host,
@Type,
@Source,
@Message,
@User,
@AllXml,
@StatusCode,
@TimeUtc
)

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

新建项目..引入Elmah.dll文件。

配置web.config

代码
<configSections>
<sectionGroup name="elmah">
<section name="security" type="Elmah.SecuritySectionHandler, Elmah"/>
<section name="errorLog" type="Elmah.ErrorLogSectionHandler, Elmah"/>
<section name="errorMail" type="Elmah.ErrorMailSectionHandler, Elmah"/>
<section name="errorFilter" type="Elmah.ErrorFilterSectionHandler, Elmah"/>
</sectionGroup>
</configSections>
<elmah>
<!--是否允许远程访问。0代表否、1代表是-->
<security allowRemoteAccess="0" />
<!--记录在SqlServer里面-->
<errorLog type="Elmah.SqlErrorLog, Elmah"
connectionStringName
="ConnectionString" />
</elmah>
<connectionStrings>
<add name="ConnectionString" connectionString="Data Source=.;Initial Catalog=TestDb;User ID=sa;Password=*****" 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="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
</system.web>
</httpModules>
新建个页面.故意抛出个异常...

访问:http://localhost/elmahDemo/elmah.axd 查看出错信息。

Elmah 还支持报错发送邮件功能只需在<elmah></elmah>之间加上

代码
<errorMail
from="test@foxmail.com"
to
="test@163.com"
subject
="系统出错...."
async
="false"
smtpPort
="25"
smtpServer
="smtp.qq.com"
userName
="xiaogang"
password
="*****"/>

怎么样 很方便吧..

posted on 2010-11-19 16:56  小刚qq  阅读(1264)  评论(1编辑  收藏  举报