侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

php  /  管理员 发布于 8年前   178

在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);    }  }}

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

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


  • 上一条:
    MVC使用T4模板生成其他类的具体实现学习笔记2
    下一条:
    MVC使用Controller代替Filter完成登录验证(Session校验)学习笔记5
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客