--前期准备(添加到队列中)
0-1在新建后的MVC项目中的【Models】中添加一个类,用于处理异常信息,并继承自HandleErrorAttribute
public class MyExceptionAttribute: HandleErrorAttribute { //创建队列集合 public static Queue<Exception> ExceptionQueue = new Queue<Exception>(); /// <summary> /// 可以捕获异常数据 /// </summary> /// <param name="filterContext"></param> public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); Exception ex = filterContext.Exception; //写到队列 //插入到队列里面 ExceptionQueue.Enqueue(ex); //跳转到错误页面 filterContext.HttpContext.Response.Redirect("/Error.html"); } }
0-2在FilterConfig文件中注册自己定义的异常处理过滤器
1.添加bll文件
2.在Web.Config中配置Log4Net
<!--Spring.Net配置--> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4" /> </sectionGroup> <!--log4net配置--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <!--Spring.Net配置节点开始--> <spring> <context> <resource uri="file://~/Config/controllers.xml" /> <resource uri="file://~/Config/services.xml" /> </context> </spring> <!--Spring.Net配置节点结束-->
<!--log4net配置节点开始--> <!-- Level的级别,由高到低 --> <!-- None > Fatal > ERROR > WARN > DEBUG > INFO > ALL--> <!-- 解释:如果level是ERROR,则在cs文件里面调用log4net的info()方法,则不会写入到日志文件中 type="log4net.Appender.RollingFileAppender":记录到文件 --> <log4net> <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --> <!-- Set root logger level to ERROR and its appenders --> <root> <level value="ERROR" /> <appender-ref ref="SysAppender" /> </root> <!-- Print only messages of level DEBUG or above in the packages --> <logger name="WebLogger"> <level value="ERROR" /> </logger> <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net"> <param name="File" value="App_Data/Log/" /> <param name="AppendToFile" value="true" /> <param name="RollingStyle" value="Date" /> <param name="DatePattern" value="yyyy\\yyyy-MM\\yyyy-MM-dd‘.txt‘" /> <param name="StaticLogFileName" value="false" /> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n" /> </layout> </appender> <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net"> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n" /> </layout> </appender> </log4net> <!--log4net配置节点结束-->
3.在Global.asax文件中的Application_Start方法中初始化log4net,不要加到页面的Load。
4.在Application_Start写以下代码,用来添加到队列
//【开启一个线程,扫描异常信息队列】 //拿到文件夹的物理路径 string filePath = Server.MapPath("/Log/"); //开启线程,使用线程池 ThreadPool.QueueUserWorkItem((a) => { //线程一直在执行 while (true) { //判断队列中有数据,Count>0表示有数据 if (MyExceptionAttribute.ExceptionQueue.Count > 0) { //取出数据 Exception ex = MyExceptionAttribute.ExceptionQueue.Dequeue(); //判断是否真正拿到数据 if (ex != null) { //【将异常信息写到日志文件中】 //根据年月日 来命名日志文件 //string fileName = DateTime.Now.ToString("yyyy-MM-dd"); //File.AppendAllText(filePath + fileName + ".txt", ex.ToString(),System.Text.Encoding.UTF8); //【使用log4net】 ILog logger = LogManager.GetLogger("errorMsg"); //将异常信息写入到log4net中 logger.Error(ex.ToString()); } else { //如果队列中没有数据,让线程休息3秒钟 Thread.Sleep(3000); } } else { //如果队列中没有数据,让线程休息3秒钟 Thread.Sleep(3000); } } }, filePath); }
原文地址:https://www.cnblogs.com/liutaovip/p/12636700.html
时间: 2024-10-03 02:56:25