c# 用ELMAH日志组件处理异常

背景

ELMAH就是一个日志的拦截和处理组件,说到.net的日志组件,大家的第一反应该是Log4Net、NLog等这些东西,关于Log4Net和NLog,可以说是.net日志组件里面使用最为广泛的组件了,它们功能强大、使用方便。

优点

相比它们:

1、ELMAH的使用更加简单,它甚至不用写一句代码;

2、ELMAH是一种“可拔插式”的组件,即在一个运行的项目里面我们可以随意轻松加入日志功能,或者移除日志功能;

3、ELMAH组件自带界面,不用写任何代码,即可查看异常日志的界面;

4、组件提供了一个用于集中记录和通知错误日志的机制,通过邮件的机制通知错误信息给相关人员。

代码实现

1、nuget安装 using Elmah;

2、Application_Error 异常404处理

protected void Application_Error(object sender, EventArgs e)
    {
      if (BQoolCommon.Helpers.Setting.CommonSetting.IsProd())
      {
        if (e is ExceptionFilterEventArgs exceptionFilter)
        {
          if (exceptionFilter.Exception is HttpException httpException && httpException.Message.StartsWith(_exceptionMsg))
          {
            Response.Redirect("/");
          }
        }
        Response.Clear();
        Server.ClearError();
        Response.StatusCode = 404;
      }
    }

3、排除 Elmah 404 寄信通知

public void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs e)
    {
      if (e.Exception is HttpException httpException && (httpException.GetHttpCode() == 404 || httpException.Message.StartsWith(_exceptionMsg)))
      {
        e.Dismiss();
      }
    }

4、自定 Elmah 发信主旨

void ErrorMail_Mailing(object sender, Elmah.ErrorMailEventArgs e)
    {
      string machineName = "none server";
      try
      {
        if (Request != null)
        {
          machineName = Request.ServerVariables["HTTP_HOST"];
        }
      }
      catch
      {
      }

      // 取得 Elamh ErrorMail 的主旨
      // "$MachineName$ at $ErrorTime$ : {0}"
      string elmahSubject = e.Mail.Subject;
      //替換 ErrorMail 的主旨內容
      string emailSubject = string.Format("BigCRM.Web Error => {0}",
        elmahSubject
          .Replace("$MachineName$", machineName)
      );

      e.Mail.Subject = emailSubject;
    }

5、web.config配置

<elmah>
  <!--
    See http://code.google.com/p/elmah/wiki/SecuringErrorLogPages for
    more information on remote access and securing ELMAH.
  -->
  <security allowRemoteAccess="false"/>
 </elmah>
 <location path="elmah.axd" inheritInChildApplications="false">
  <system.web>
   <httpHandlers>
    <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah"/>
   </httpHandlers>
   <!--
    See http://code.google.com/p/elmah/wiki/SecuringErrorLogPages for
    more information on using ASP.NET authorization securing ELMAH.

   <authorization>
    <allow roles="admin" />
    <deny users="*" />
   </authorization>
   -->
  </system.web>
  <system.webServer>
   <handlers>
    <add name="ELMAH" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode"/>
   </handlers>
  </system.webServer>
 </location>

运行效果

总结

ELMAH对于中小项目来说不失为一种不错的选择;

以上就是c# 用ELMAH日志组件处理异常的详细内容,更多关于c# ELMAH日志组件的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#异常处理知识汇总

    概念 异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常 但并不是所有的错误都是异常 而处理这种错误,称为异常处理 异常处理实际是不断去发掘异常.修改异常,使程序更稳定 异常处理主要表现在四个方面: 1 程序开发前:尽可能的想到会发生的错误,标注怎么处理应对 2 程序开发中:尽量暴露程序的问题,解决这些可能的异常 3 系统发布后:尽可能的解决隐藏的或测试人员未测试到的程序问题 4 发生异常时:异常代码转化成了友好提示显示给用户 异常分类 编译错误 1 大小写混淆 2 数据

  • c# 基于任务的异步编程模式(TAP)的异常处理

    在前面讲到了<基于任务的异步编程模式(TAP)>,但是如果调用异步方法,没有等待,那么调用异步方法的线程中使用传统的try/catch块是不能捕获到异步方法中的异常.因为在异步方法执行出现异常之前,已经执行完毕. 1.没有等待的调用异步方法 ThrowAfter方法是在一定延迟后抛出一个异常: private async Task ThrowAfter(int ms,string message) { await Task.Delay(ms); Console.WriteLine("

  • C# WebApi 异常处理解决方案

    前言:上篇C#进阶系列--WebApi接口传参不再困惑:传参详解介绍了WebApi参数的传递,这篇来看看WebApi里面异常的处理.关于异常处理,作为程序员的我们肯定不陌生,记得在介绍 AOP的时候,我们讲过通过AOP可以统一截获异常.那么在我们的WebApi里面一般是怎么处理异常的呢,今天这一篇,博主带着大家一起来实践下WebApi的异常处理. 为什么说是实践?因为在http://www.asp.net里面已经明确给出WebApi的异常处理机制.光有理论还不够,今天我们还是来试一把.通过实践,

  • C# 使用 log4net 日志组件的方法

    一. 什么是 log4net Apache log4net 库是帮助程序员将日志语句输出到各种输出目标的工具,它是从Java中的Log4j迁移过来的一个.Net版的开源日志框架.log4net 的一个显著特征是分层记录器的概念,使用这些记录器可以有选择地控制任意粒度输出日志语句.主要特征如下: 支持多个框架 输出到多个日志记录目标 分层日志记录体系结构 XML 配置 动态配置 日志记录上下文 久经考验的架构 模块化和可扩展设计 高性能和灵活性 二.C# 使用 log4net 添加Nuget 包,

  • C#异常处理的技巧和方法

    c#中或多或少回出现一些意向不道的异常,那么如何去捕获这个异常就非常的关键--这个异常可能是系统的不可控因素也有可能是程序本身才一个异常.下面就具体的解决方案提供给大家,希望有所帮助 从最常见的分母为0的情况的实例 通过try catch finally三个关键字的一个语法结构图.finally是监听程序是否在try或者catch中执行 下面列举的是try执行的语句是一个异常错误的情况 下面列举的是try执行语句是一个正确的情况 异常类的一个继承顺序图,异常类中的属性列表 catch中的表达式的

  • C#多线程中的异常处理操作示例

    本文实例讲述了C#多线程中的异常处理操作.分享给大家供大家参考,具体如下: 常规Thread中处理异常 使用Thread创建的子线程,需要在委托中捕捉,无法在上下文线程中捕捉 static void Main(string[] args) { ThreadStart threadStart = DoWork; Thread thread = new Thread(threadStart); thread.Start(); thread.Join(); } static void DoWork()

  • C#控制台程序使用Log4net日志组件详解

    C#控制台程序使用Log4net日志组件,供大家参考,具体内容如下 1.Log4net一般都不陌生,但是在配置上不同类型的项目又不相同的地方比如C#控制台程序和C# MVCWeb项目,拿控制台项目为例 项目源码在文章底部 2.首先创建一个控制台程序,引入Log4net.dll --使用NuGet 3.进行一些简单的配置,在App.config文件中配置,如果大家没有App.config文件,可以通过在解决方案中,添加新建项→应用程序配置文件,进行添加. <?xml version="1.0

  • C#异常处理中try和catch语句及finally语句的用法示例

    使用 try/catch 处理异常 try-catch 块的用途是捕捉和处理工作代码所生成的异常. 有些异常可以在 catch 块中处理,解决问题后不会再次引发异常:但更多情况下,您唯一能做的是确保引发适当的异常. 示例 在此示例中,IndexOutOfRangeException 不是最适当的异常:对本方法而言 ArgumentOutOfRangeException 更恰当些,因为错误是由调用方传入的 index 参数导致的. class TestTryCatch { static int G

  • c# 用ELMAH日志组件处理异常

    背景 ELMAH就是一个日志的拦截和处理组件,说到.net的日志组件,大家的第一反应该是Log4Net.NLog等这些东西,关于Log4Net和NLog,可以说是.net日志组件里面使用最为广泛的组件了,它们功能强大.使用方便. 优点 相比它们: 1.ELMAH的使用更加简单,它甚至不用写一句代码: 2.ELMAH是一种"可拔插式"的组件,即在一个运行的项目里面我们可以随意轻松加入日志功能,或者移除日志功能: 3.ELMAH组件自带界面,不用写任何代码,即可查看异常日志的界面: 4.组

  • log4j2 项目日志组件的实例代码

    在项目运行过程中,常常需要进行功能调试以及用户行为的跟踪和记录,部分人习惯使用System.out,但这并不建议,它仅仅是使用方便但不便于维护也无扩展性.相比log4j的话,log4j可以控制日志信息的输送目的地.输出格式以及级别等等,使我们能够更加细致地控制日志的生成过程. Log4j2是对Log4j1的升级,在性能和功能上有显著的改进,包括多线程中吞吐量的增强.占位符的支持.配置文件自动重新加载等 一.入门介绍 1.下载jar包 pox.xml <dependencies> <dep

  • C#使用日志组件log4net

    目录 一.概述 1.下载与版本 2.Log4net的结构 3.日志的级别 二.建立log4net配置文件 1.配置文件 2.Logger 3.Appender 4.PatternLayout中的转换模式 三.定义配置文件 1.在Winfrom中,在AssemblyInfo.cs中添加如下代码: 2.在asp.net中,在Global.asax文件中的Application_Start方法中增加: 四.调用log4net写日志 1.创建或获取日志对象 2.输出日志信息 五.更改Appender设置

  • SpringBoot快速集成Logback日志组件

    目录 前言 引入: 配置: 开发: 结语 前言 在前一节的分享中,慕歌向大家介绍了如何使用spring boot 实现简单的邮寄发送服务,用于验证码服务或者是通知服务.如果大家有兴趣,慕歌还想向大家进一步分享,如何在使用第三方服务,实现手机短信通知服务,就是那个我们每天都会使用到的短信验证码,通知服务.这一节慕歌想带来spring boot日志系统的分享,以及慕歌自己的实现的简易日志记录,慕歌会将日志同时保存在文件和数据库之中. 引入: 如果我们使用 logback 就无需额外引入依赖,在spr

  • linux 后台日志 mysql 错误异常的解释(推荐)

    1.Caused by: com.MySQL.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 56,201,339 milliseconds ago.  The last packet sent successfully to the server was 56,201,339 milliseconds ago. is longer t

  • 基于Windows C++ 应用程序通用日志组件的使用详解

    引言 在如何记录程序日志方面,通常有三种选择: 1.采用Log4CXX等公共开源日志组件:这类日志组件的特点是跨平台且功能比较强大,例如可以把日志发往另一台服务器或记录到数据库中等:另外,可配置性较高,可以通过配置文件或程序代码对日志进行很多个性化设置.但从另外一个角度看,由于这些优点往往也导致了在使用方面的缺点.首先,对于一般应用程序来说,它们并不需要太多的功能,通常只需要把日志记录到文件或反馈到应用程序,功能太多反正让用户使用起来觉得繁琐还得背负很多从来都用不到的代码.其次,这类日志组件通常

  • express默认日志组件morgan的方法

    章节概览 morgan是express默认的日志中间件,也可以脱离express,作为node.js的日志组件单独使用.本文由浅入深,内容主要包括: morgan使用入门例子 如何将日志保存到本地文件 核心API使用说明及例子 进阶使用:1.日志分割 2.将日志写入数据库 源码剖析:morgan的日志格式以及预编译 入门例子 首先,初始化项目. npm install express morgan 然后,在basic.js中添加如下代码. var express = require('expre

  • Java日志组件间关系详解

    一. 总览 本文章不对日志组件进行优劣评价,只是对关系进行对比.在日志中组件中存在这样的几种关系, 这几种关系理解清楚, 有助于我们对日志的引入和使用. 二. 日志门面 日志门面就是指直接引入我们程序中进行记录日志的日志组件,作为日志门面的这些组件会在程序中直接依赖, 上图中就列举的几种常见的日志门面的组件.像一些软件直接回默认使用一些组件, 比如Spring使用的就是commons-logging, activiti使用的日志门面就是slf4j, 其他的软件也都会选用自己认为好用的日志门面.

  • 详解.Net Core中的日志组件(Logging)

    1.介绍 Logging组件是微软实现的日志记录组件包括控制台(Console).调试(Debug).事件日志(EventLog)和TraceSource,但是没有实现最常用用的文件记录日志功能(可以用其他第三方的如NLog.Log4Net.之前写过NLog使用的文章). 2.默认配置 新建.Net Core Web Api项目,添加下面代码. [Route("api/[controller]")] public class ValuesController : Controller

随机推荐