MVC使用Log4Net进行错误日志记录学习笔记4

在Web应用运行过程中,我们难免会遇到程序运行异常,这个时候我们就应该将异常信息记录下来,以便开发人员和维护人员对异常原因进行还原,对异常原因进行修复。在ASP.NET平台中进行日志记录的组件也有很多,如Log4Net、CommonLogging等,我们这里选用Log4Net进行异常日志的记录。

1. 捕获异常

在ASP.NET MVC中提供了一个全局的异常处理过滤器:HandleErrorAttribute,可以通过该过滤器捕获异常信息。

我们在Models文件夹下新建类型Log4ExceptionAttribute,继承HandleErrorAttribute类,同时重写OnException方法来捕获异常数据:

using System.Web.Mvc;

namespace PMS.WebApp.Models
{
  public class Log4ExceptionAttribute:HandleErrorAttribute
  {
    /// <summary>
    /// 重写OnException方法来捕获异常数据
    /// </summary>
    /// <param name="filterContext"></param>
    public override void OnException(ExceptionContext filterContext)
    {
      base.OnException(filterContext);
      //捕获当前异常数据
      var ex = filterContext.Exception;
    }
  }
}

新建过滤器后我们还需要在Global文件中调用的RegisterGlobalFilters方法中完成自己定义异常处理过滤的注册。

using System.Web.Mvc;
using PMS.WebApp.Models;

namespace PMS.WebApp
{
  public class FilterConfig
  {
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
      //filters.Add(new HandleErrorAttribute());
      filters.Add(new Log4ExceptionAttribute());
    }
  }
}

2. 考虑到多用户并发操作时可能产生的问题,我们需要新建一个队列来进行异常信息的暂存,同时开辟一个线程专门对队列中的异常信息进行处理。

在Log4ExceptionAttribute类中新建一个静态的异常类型的队列,在发生异常后,程序自动触发OnException方法,方法中将当前的异常信息入队后,跳转到错误页面。

using System;
using System.Collections.Generic;
using System.Web.Mvc;

namespace PMS.WebApp.Models
{
  public class Log4ExceptionAttribute:HandleErrorAttribute
  {
    public static Queue<Exception> Exceptions=new Queue<Exception>();
    /// <summary>
    /// 重写OnException方法来捕获异常数据
    /// </summary>
    /// <param name="filterContext"></param>
    public override void OnException(ExceptionContext filterContext)
    {
      base.OnException(filterContext);
      //捕获当前异常数据
      var ex = filterContext.Exception;
      //将异常数据入队
      Exceptions.Enqueue(ex);
      //跳转到错误页面
      filterContext.HttpContext.Response.Redirect("/Error.html");
    }
  }
}

Log4Net的配置是在应用程序配置文件中进行的,我们先在配置文件中进行Log4Net的配置。Log4Net需要配置的节点位置和SpringNet完全相同,首先需要在configSessions中新增子节点,然后在configuration节点中增加log4net节点完成具体配置。

<configuration>
 <configSections>
  <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->

  <!--↓Log4Net配置↓-->
  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  <!--↑Log4Net配置↑-->

  <!--↓Spring.Net配置↓-->
  <sectionGroup name="spring">
   <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4"/>
  </sectionGroup>
  <!--↑Spring.Net配置↑-->

 </configSections>

 <!--↓Spring.Net配置↓-->
 <spring>
  <context>
   <resource uri="file://~/Config/controllers.xml"/>
   <resource uri="file://~/Config/services.xml"/>
  </context>
 </spring>
 <!--↑Spring.Net配置↑-->

 <!--↓Log4Net配置↓-->
 <log4net>
  <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
  <!-- Set root logger level to ERROR and its appenders -->
  <root>
   <level value="ALL"/>
   <appender-ref ref="SysAppender"/>
  </root>

  <!-- Print only messages of level DEBUG or above in the packages -->
  <logger name="WebLogger">
   <level value="DEBUG"/>
  </logger>

  <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" >
   <param name="File" value="App_Data/" />
   <param name="AppendToFile" value="true" />
   <param name="RollingStyle" value="Date" />
   <param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" />
   <param name="StaticLogFileName" value="false" />
   <layout type="log4net.Layout.PatternLayout,log4net">
    <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
    <param name="Header" value="
----------------------header--------------------------
" />
    <param name="Footer" value="
----------------------footer--------------------------
" />
   </layout>
  </appender>
  <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">
   <layout type="log4net.Layout.PatternLayout,log4net">
    <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
   </layout>
  </appender>
 </log4net>
 <!--↑Log4Net配置↑-->
 ...
</configuration>

在配置文件中可以对日志记录的信息、格式、文件名等作出具体的配置,下面是配置信息的详解

<?xml version="1.0"?>
<configuration>
 <configSections>
  <section name="log4net"
       type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
 </configSections>
 <!--站点日志配置部分-->
 <log4net>
  <root>
   <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
   <!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录-->
   <!--如果没有定义LEVEL的值,则缺省为DEBUG-->
   <level value="ERROR"/>
   <appender-ref ref="RollingFileAppender"/>
  </root>
  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
   <!--日志文件名开头-->
   <file value="c:\Log\TestLog4net.TXT"/>
   <!--多线程时采用最小锁定-->
   <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
   <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
   <datePattern value="(yyyyMMdd)"/>
   <!--是否追加到文件,默认为true,通常无需设置-->
   <appendToFile value="true"/>
   <!--变换的形式为日期,这种情况下每天只有一个日志-->
   <!--此时MaxSizeRollBackups和maximumFileSize的节点设置没有意义-->
   <!--<rollingStyle value="Date"/>-->
   <!--变换的形式为日志大小-->
   <!--这种情况下MaxSizeRollBackups和maximumFileSize的节点设置才有意义-->
   <RollingStyle value="Size"/>
   <!--每天记录的日志文件个数,与maximumFileSize配合使用-->
   <MaxSizeRollBackups value="10"/>
   <!--每个日志文件的最大大小-->
   <!--可用的单位:KB|MB|GB-->
   <!--不要使用小数,否则会一直写入当前日志-->
   <maximumFileSize value="2MB"/>
   <!--日志格式-->
   <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%t]%-5p %c - %m%n"/>
   </layout>
  </appender>
 </log4net>
</configuration>

在Global文件中的Application_Start方法中开启一个线程,用于将队列中的错误信息写入日志文件。

using System.Linq;
using System.Threading;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using log4net;
using PMS.WebApp.Models;
using Spring.Web.Mvc;

namespace PMS.WebApp
{
  // 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
  // 请访问 http://go.microsoft.com/?LinkId=9394801

  public class MvcApplication : SpringMvcApplication//HttpApplication
  {
    protected void Application_Start()
    {
      log4net.Config.XmlConfigurator.Configure();//读取Log4Net配置信息
      AreaRegistration.RegisterAllAreas();

      WebApiConfig.Register(GlobalConfiguration.Configuration);
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
      RouteConfig.RegisterRoutes(RouteTable.Routes);
      BundleConfig.RegisterBundles(BundleTable.Bundles);

      //开启一个线程,扫描异常信息队列.
      var filePath = Server.MapPath("/Log/");
      ThreadPool.QueueUserWorkItem((a) =>
      {
        while (true)
        {
          //判断队列中是否有数据
          if (Log4ExceptionAttribute.Exceptions.Any())
          {
            //出队一条异常信息
            var ex = Log4ExceptionAttribute.Exceptions.Dequeue();
            //若异常信息不为空
            if (ex == null) continue;
            //将异常信息写入到日志文件中
            var logger = LogManager.GetLogger("errorMsg");
            logger.Error(ex.ToString());
          }
          else
          {
            //若异常信息队列为空,则线程休息三秒
            Thread.Sleep(3000);
          }
        }
      }, filePath);
    }
  }
}

成功完成错误日志的配置。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2016-09-19

Log4Net 日志配置[附带源码下载]

前述 园子里有许多人对log4net这款开源的日志记录控件有很多介绍.在这里个人再做一次总结,希望对以后有所帮助,需要的时候可以直接使用,减少查阅资料的时间.利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库,并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错误).ERROR(一般错误).WARN(警告).INFO(一般信息).DEBUG(调试信息).log4net 有四种主要的组件,分别是Logger(记录器), Repos

Log4net 日志记录详细介绍及应用

Log4net 日志 概要: Log4net是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.日志是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运行过程的步骤.成功失败记录下来,将关键性的数据记录下来,进而分析系统问题所在.因为对于网站来说,不能把异常信息显示给用户,异常信息只能记录到日志.网站出问题后,开发人员查看日志就知道问题所在. 一.如何配置Log4net环境 1.添加"应用程序配置文件"(App.config); 2

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

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

.net下log4net使用方法详解

本文实例为大家分享了.net下log4net的使用方法,供大家参考,具体内容如下 这里以控制台应用程序为例 首先是要添加引用: 安装后可以看到项目中多了log4net的引用: 添加应用程序配置文件app.config,配置log4net <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="lo

log4net创建系统日志的详细步骤

前言用户可以从http://logging.apache.org/log4net/下载log4net的源代码.解压软件包后,在解压的src目录下将log4net.sln载入Visual Studio .NET,编译后可以得到log4net.dll.用户要在自己的程序里加入日志功能,只需将log4net.dll引入工程即可. 在项目中配置 第一步:首先在项目中引用log4net.dll文件.第二步:在Web.config文件中进行添加configSections的节点 复制代码 代码如下: <co

log4net教程日志分类和自动维护示例

如果我们需要通过配置不同的ILog,流程是这样的,首先要创建一个ILoggerRepository,通过它来进行日志等级的配置,和各种Appender,接着通过LogManager在ILoggerRepository获取一个Ilog对象,就可以写日志了.代码如下: 复制代码 代码如下: public static ILog GetLogger(string repositoryName = "")        {            if (string.IsNullOrEmpty

log4net配置和使用方法分享

1.Global.asax文件 复制代码 代码如下: void Application_Start(object sender, EventArgs e) {//在应用程序启动时运行的代码log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Sxmobi.FileHelper.GetMapPath("~\\log4net.config")));} 2.log4net.config 文件 复制代码

asp.net log4net的使用方法

刚开始接触asp.net,关于日志记录怎么能少,因此简单记录一下log4net的配置和使用,以防以后忘记.   首先引入log4net.dll,关于这个文件自己百度下载下. 然后配置一下有关配置,在web.config中加入在configuration节点下 <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log

Log4net日志记录组件的使用步骤详解和下载

第一步: 添加并应用Log4net.dll.然后在Web.config文件中添加下面的配置局 复制代码 代码如下: <configSections>     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> 第二步: 新建Log4Net.config的配置文件,

C#实现Log4Net日志分类和自动维护实例

本文实例讲述了C#实现Log4Net日志分类和自动维护的实现方法.分享给大家供大家参考.具体实现方法如下: 一.背景 在程序中,我们调试运行时信息,Log4Net是一个不错的解决方案.不知道是我用的不好,用到最后反而都不想看日志了.原因是因为我n个功能使用的默认的Logger来记录日志,这样以来,所有功能记录的信息都依赖同一个配置,于是所有的信息都在一个文件中,有时候查找起来,极其不方便. 我想,能不能按照功能分类呢?如果通过配置不同的logger,然后功能根据不同的LoggerName加载Il

Linux下把tomcat日志按日期自动分割

Linux中tomcat日志分割需要用到cronolog 附上cronolog-1.6.2.tar.gz 1. 安装cronolog tar –zxvf cronolog-1.6.2.tar.gz ./configure && make && make install 解压,编译, 安装 (安装后目录一般在/usr/local/中) 2. 为了能够一次正确通过还是验证一下是在哪个目录 which cronolog 3.修改catalina.sh脚本 vim /usr/loc

基于localStorge开发登录模块的记住密码与自动登录实例

关于这个模块功能模块的由来,这是鸟大大的处女秀,为什么这么说呢?一天在群里,一个哥们说有私活,开发一个****模块,我那天手痒痒就和他聊了两句,然后,就决定给她做这个模块了,和他谈了谈交付时间,他说最迟两天,然后谈了谈加个,最后达成,500¥!!!这个模块其实第一天晚上我就开发出来了,那时我给他微信说,功能模块开发ok了,要不要远程查看一下,没问题的话就交了,一会他回我,好了就发过来,然后微信就转过来500¥,当时很诧异,毕竟是处女秀,然后就把项目交给他了,并且是完美交付,在客户那里,也没有出现

form自动提交实例讲解

在做项目中,例如b2b的由商城跳往卖家中心的后台,当他既有会员账号又是卖家的时候,让他登录了商城,就不需要卖家登录的时候,处理过程中可以用到form表单自动登录. 实现简单思路:可以再普通会员登录的地方,登录成功可以将登录名和密码,用户id存起来,为了安全可以aes加密(前面一篇文章有详细介绍),存入cookie,在页面中需要去卖家中心,那边可以判断开始所存的cookie,以及判断是否是卖家,如果是,用form表单自动给他登录. 在ecshop上面实现的案例: 在includes下面创建一个li

ThinkPHP中create()方法自动验证实例

自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 原理: create()方法收集表单($_POST)信息并返回,同时触发表单自动验证,过滤非法字段, 在控制器中使用create()方法,(返回值为true/false),会自动触发模型类中的$_validate属性(为父类Model中的方法,在子类Model中重写),在$_validate中自定义验证规则(验证规则下面会详细说明),当create()方法没有数据即返回值为fals

运用JSP+ajax实现分类查询功能的实例代码

本文主要是介绍了运用JSP+ajax实现分类查询功能的实例代码,分享给大家供大家参考,具体如下: 这次是对小学期关于大学毕业生信息管理系统课程设计中遇到的一些问题和解决方法进行记录和分享. 题目要求:提供企业招聘信息(本年度或历年)查询功能: 首先建立一个jsp文件用来显示数据库信息,并在上面加输入条件的文本框和查询按钮,在这个jsp文件中需要完成一个js函数在用于完成查询功能. <%@ page language="java" pageEncoding="UTF-8&

MySql超长自动截断实例详解

MySql超长自动截断实例详解 小伙伴问到一个问题,为啥在项目中调用插入或者更新语句时超长的字无法自动截断,而在navicat中直接执行是可以自动截断的? 如下 CREATE TABLE `p_app_station` ( `WX_APP_ID` varchar(20) NOT NULL, `APP_SECRET` varchar(33) DEFAULT NULL, `IS_BINDING` int(1) DEFAULT '0', `ACCOUNT_ID` int(13) DEFAULT NUL