博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Asp.net MVC WebApi 中使用ELMAH
阅读量:5895 次
发布时间:2019-06-19

本文共 7195 字,大约阅读时间需要 23 分钟。

ELMAH(The Error Logging Modules And Handlers)错误日志模块和处理,它提供了一个用于集中记录和通知错误日志的机制。

一、添加程序集引用

打开VS2012新建一个asp.net mvc 4 web应用程序项目。右键项目【管理NuGet程序包】,搜索ELMAH如图:

注意:要选择“Elmah.MVC”然后安装,第一个“ELMAH”只是在传统的webform中用到的。

二、配置web.config

安装完成之后在配置文件中会自动添加一些配置项目:

 <configSections>节中添加

 

<appSettings>节中添加

 

<system.web>节中添加

 

<system.webServer>节中添加

 

<elmah>节,注意,这个地方要修改为日志保存方式为 Sql server 数据库,连接字符串为 DefaultConnection,

   <connectionStrings>

    <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(local);Initial Catalog=iCareSer;Integrated Security=True" />
  </connectionStrings>

 

手动添加以下代码

 

Web.config 修改完毕

三、配置数据库表

如果配置为数据库保存日志记录,则需要配置数据库的表和存储过程,代码如下:

View Code
/* 错误管理工具 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]GOSET QUOTED_IDENTIFIER ONGOSET ANSI_NULLS ONGO/*创建存储过程,得到单个错误xml */CREATE PROCEDURE dbo.ELMAH_GetErrorXml(    @Application NVARCHAR(60),    @ErrorId UNIQUEIDENTIFIER)ASSET NOCOUNT ON SELECT    AllXmlFROM    ELMAH_ErrorWHERE    ErrorId = @ErrorIdAND    Application = @ApplicationGOSET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS ONGO/*创建存储过程,得到错误总记录*/SET QUOTED_IDENTIFIER ONGOSET ANSI_NULLS ONGOCREATE PROCEDURE dbo.ELMAH_GetErrorsXml(    @Application NVARCHAR(60),    @PageIndex INT = 0,    @PageSize INT = 15,    @TotalCount INT OUTPUT)ASSET NOCOUNT ONDECLARE @FirstTimeUTC DateTimeDECLARE @FirstSequence intDECLARE @StartRow intDECLARE @StartRowIndex int-- Get the ID of the first error for the requested pageSET @StartRowIndex = @PageIndex * @PageSize + 1SET ROWCOUNT @StartRowIndexSELECT     @FirstTimeUTC = TimeUTC,    @FirstSequence = SequenceFROM    ELMAH_ErrorWHERE      Application = @ApplicationORDER 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 @PageSizeSELECT    @TotalCount = COUNT(1)FROM    ELMAH_ErrorWHERE    Application = @ApplicationSELECT    errorId,    application,    host,    type,    source,    message,    [user],    statusCode,    CONVERT(VARCHAR(50), TimeUtc, 126) + 'Z' timeFROM    ELMAH_Error errorWHERE    Application = @ApplicationAND    TimeUTC <= @FirstTimeUTCAND    Sequence <= @FirstSequenceORDER BY    TimeUTC DESC,    Sequence DESCFOR    XML AUTOGOSET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS ONGO/*存储过程:插入数据 */SET QUOTED_IDENTIFIER ONGOSET ANSI_NULLS ONGOCREATE 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)ASSET NOCOUNT ONINSERTINTO    ELMAH_Error    (        ErrorId,        Application,        Host,        Type,        Source,        Message,        [User],        AllXml,        StatusCode,        TimeUtc    )VALUES    (        @ErrorId,        @Application,        @Host,        @Type,        @Source,        @Message,        @User,        @AllXml,        @StatusCode,        @TimeUtc    )GOSET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS ONGO

 

在DefaultConnection配置的数据库中执行代码。

四、测试

1. 运行新建的asp.net mvc4 应用程序项目,正常运行显示页面“

欢迎使用 ASP.NET Web API!

修改此模板中的代码以快速开始您的 ASP.NET Web API 开发。

2.写一段错误的代码,在Controllers里面HomeController.cs 文件中加一段代码

public ActionResult Index()

{
  int x = int.Parse("b");
  return View();
}

然后执行,肯定会报错,你会看到

“/”应用程序中的服务器错误。


输入字符串的格式不正确。

说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.FormatException: 输入字符串的格式不正确。
源错误:

行 11:         public ActionResult Index()行 12:         {行 13:                  int x = int.Parse("b");行 14:             return View();行 15:         }

源文件: d:\VS2012代码\MvcApplication1\MvcApplication1\Controllers\HomeController.cs    行: 13             

 

3. 在地址栏输入  端口号自己改,会看到以下页面

OK,成功了!

4. 还没完,还没有在WebApi中测试呢,打开默认的ValuesController.cs 这是一个ApiController,通常情况下我们是用jquery 异步方式调用ApiController的。

    在ValuesController.cs修改Get()方法,让他发出错误:

// GET api/values/5        public string Get(int id)        {            int k = 0;            int i = 2/k;            return "value";        }

 

   然后用javascript 调用这个方法,在View/homn/index.cshtml文件最后加上js代码:

 

 然后编译运行,要去掉之前测试HomeController.cs 中的错误代码,要不然运行不了。

点击“测试”按钮无反应,用firebug查看有错误信息,再在浏览器中  查看,但是发现没有记录到错误信息,为什么?

这就是开头说的要添加ELMAH.MVC而不是ELMAH,在WebApi中还要做另外的工作。

在App_Start文件夹中添加 ElmahErrorAttribute.cs类,代码:

public class ElmahErrorAttribute :System.Web.Http.Filters.ExceptionFilterAttribute    {        public override void OnException(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)        {            if (actionExecutedContext.Exception != null)            {                Elmah.ErrorSignal.FromCurrentContext().Raise(actionExecutedContext.Exception);            }            base.OnException(actionExecutedContext);        }    }

 

然后在 Global.asax 文件Application_Start方法中添加一句:GlobalConfiguration.Configuration.Filters.Add(new ElmahErrorAttribute());

protected void Application_Start()        {            AreaRegistration.RegisterAllAreas();            WebApiConfig.Register(GlobalConfiguration.Configuration);            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);            RouteConfig.RegisterRoutes(RouteTable.Routes);            BundleConfig.RegisterBundles(BundleTable.Bundles);            GlobalConfiguration.Configuration.Filters.Add(new ElmahErrorAttribute());        }

 

然后再编译,运行点击“测试”,打开,发现已经记录了错误信息。  

五、注意事项和待解决问题

1.如果异常通过catch被捕获了就无法记录了,除非捕获后又throw。也就是在异常链上,最终的异常必须抛给了ASP.NET运行时,才可以被捕获。

2.ELMAH配置的数据库连接字符串无法加密,或者无法指定为加密了的connectionstring;

3.日志内容是增长的,但ELMAH没有提供清空日志的功能;

4. 访问权限问题,在后续文章中阐述。

 

转载于:https://www.cnblogs.com/liquanchun/archive/2012/12/21/2827724.html

你可能感兴趣的文章
3.1链表----链表(Linked List)入门
查看>>
异步编程思想
查看>>
"数学口袋精灵"bug(团队)
查看>>
2017python第六天作业 面向对象 本节作业: 选课系统
查看>>
Scribes:小型文本编辑器,支持远程编辑
查看>>
为什么要使用 SPL中的 SplQueue实现队列
查看>>
ssh 安装笔记
查看>>
游戏音效下载网站大全
查看>>
实验五
查看>>
程序包+创建包规范+创建包体+删除程序包
查看>>
3-继承
查看>>
海归千千万 为何再无钱学森
查看>>
vue2.0 仿手机新闻站(六)详情页制作
查看>>
FreeRTOS的内存管理
查看>>
JSP----九大内置对象
查看>>
Java中HashMap详解
查看>>
Office版本差别引发的语法问题
查看>>
web前端(10)—— 浮动,清除默认样式
查看>>
ggplot2 aes函数map到data笔记
查看>>
delphi基本语法
查看>>