.NET MVC记录错误日志
使用处理异常的过滤器 HandleErrorAttribute
1.新建一个类继承自 HandleErrorAttribute,然后重写OnException这个方法
将错误信息写入队列中
1 public class MyExceptionAttribute : HandleErrorAttribute 2 { 3 public static Queue<Exception> ExecptionQueue = new Queue<Exception>(); 4 /// <summary> 5 /// 可以捕获异常数据 6 /// </summary> 7 /// <param name="filterContext"></param> 8 public override void OnException(ExceptionContext filterContext) 9 { 10 base.OnException(filterContext); 11 Exception ex = filterContext.Exception; 12 //写到队列 13 ExecptionQueue.Enqueue(ex); 14 //跳转到错误页面. 15 filterContext.HttpContext.Response.Redirect("/Error.html"); 16 } 17 }
只要程序出错就会执行这个方法。
2.注册定义好的异常过虑器
打开App_Start文件夹中FilterConfig.cs修改
1 public class FilterConfig 2 { 3 public static void RegisterGlobalFilters(GlobalFilterCollection filters) 4 { 5 // filters.Add(new HandleErrorAttribute()); 6 filters.Add(new MyExceptionAttribute()); 7 } 8 }
验证一下:在1中定义的过虑器的ex行打一个断点,然后在控制器的action中增加一段出错的代码
1 public ActionResult Index() 2 { 3 int a = Convert.ToInt16("aaa"); 4 return Content(a.ToString()); 5 // return View(); 6 }
运行可以看到效果:
3.开启一个新的线程不断的读取队列,通过Log4把消息写入日志文件
读取消息应该在程序开始的时候就开始执行,在Global.asax.cs中添加代码
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); //开启一个线程,扫描异常信息队列。 string filePath = Server.MapPath("/Log/"); ThreadPool.QueueUserWorkItem((a) => { while (true) { //判断一下队列中是否有数据 if (MyExceptionAttribute.ExecptionQueue.Count() > 0) { Exception ex=MyExceptionAttribute.ExecptionQueue.Dequeue(); if (ex != null) { //将异常信息写到日志文件中。 ILog logger = LogManager.GetLogger("errorMsg"); logger.Error(ex.ToString()); } else { //如果队列中没有数据,休息 Thread.Sleep(3000); } } else { //如果队列中没有数据,休息 Thread.Sleep(3000); } } },filePath); }
5.配置Log4
1 <configuration> 2 <configSections> 3 <!--Log4Net配置--> 4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 5 </configSections> 6 <log4net> 7 <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --> 8 <!-- Set root logger level to ERROR and its appenders --> 9 <root> 10 <level value="ALL" /> 11 <appender-ref ref="SysAppender" /> 12 </root> 13 <!-- Print only messages of level DEBUG or above in the packages --> 14 <logger name="WebLogger"> 15 <level value="DEBUG" /> 16 </logger> 17 <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net"> 18 <!--文件路径--> 19 <param name="File" value="App_Data/" /> 20 <!--文件追加--> 21 <param name="AppendToFile" value="true" /> 22 <!--备份类型--> 23 <param name="RollingStyle" value="Date" /> 24 <!--文件名称--> 25 <param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" /> 26 <!--是否固定名称--> 27 <param name="StaticLogFileName" value="false" /> 28 <layout type="log4net.Layout.PatternLayout,log4net"> 29 <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> 30 <param name="Header" value=" ----------------------header-------------------------- " /> 31 <param name="Footer" value=" ----------------------footer-------------------------- " /> 32 </layout> 33 </appender> 34 <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net"> 35 <layout type="log4net.Layout.PatternLayout,log4net"> 36 <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> 37 </layout> 38 </appender> 39 </log4net> 40 <!--Log4Net配置结束--> 41 </configuration>