利用队列记录错误日志

2018-06-22 07:48:23来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

日志是给程序猿看的。

具体步骤:

1、创建一个WebApplication

2、[可以在Model文件夹里创建一个类MyExceptionAttribute.cs]

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace WebApp.Models
 8 {
 9     //继承HandleErrorAttribute,在/App_Start/FilterConfig.cs中 添加MyExceptionAttribute的控制
10     public class MyExceptionAttribute:HandleErrorAttribute
11     {
12         //创建一个队列 静态 所有异常都在同一个队列中 处理
13         public static Queue<Exception> ExceptionQueue = new Queue<Exception>();
14         public override void OnException(ExceptionContext filterContext)
15         {
16             base.OnException(filterContext);
17             Exception ex = filterContext.Exception;
18             //写到队列中
19             ExceptionQueue.Enqueue(ex);
20             //跳转到 错误页
21             filterContext.HttpContext.Response.Redirect("/error.html");
22         }
23     }
24 }
View Code

2.1、让MyExceptionAttribute继承HandleErrorAttribute、并重写OnException方法。

2.2创建一个静态队列,使所有 错误日志都在同一个队列中进行

public static Queue<Exception> ExceptionQueue = new Queue<Exception>();

3、需要将MyExceptionAttribute在 FilterConfig.cs(/App_Start/ FilterConfig.cs)中进行标记

 1 using System.Web;
 2 using System.Web.Mvc;
 3 using WebApp.Models;
 4 
 5 namespace WebApp
 6 {
 7     public class FilterConfig
 8     {
 9         public static void RegisterGlobalFilters(GlobalFilterCollection filters)
10         {
11             //filters.Add(new HandleErrorAttribute());
12             filters.Add(new MyExceptionAttribute());
13         }
14     }
15 }
View Code

4、然后在Global.asax开启线程,将队列中的错误日志写入txt文件中。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.IO;
 4 using System.Linq;
 5 using System.Threading;
 6 using System.Web;
 7 using System.Web.Mvc;
 8 using System.Web.Optimization;
 9 using System.Web.Routing;
10 using WebApp.Models;
11 
12 namespace WebApp
13 {
14     public class MvcApplication : System.Web.HttpApplication
15     {
16         protected void Application_Start()
17         {
18             AreaRegistration.RegisterAllAreas();
19             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
20             RouteConfig.RegisterRoutes(RouteTable.Routes);
21             BundleConfig.RegisterBundles(BundleTable.Bundles);
22             //开启线程  将队列中的异常 写入文件中
23             //开启一个线程 扫描队列
24             string filePath = Server.MapPath("/Log/");
25             ThreadPool.QueueUserWorkItem((a) =>
26             {
27                 while (true)
28                 {
29                     //判断一下队列中是否 有数据
30                     if (MyExceptionAttribute.ExceptionQueue.Count() > 0)
31                     {
32                         Exception ex = MyExceptionAttribute.ExceptionQueue.Dequeue();
33                         if (ex != null)
34                         {
35                             //将异常 信息写入文件中
36                             string fileName = DateTime.Now.ToString("yyyy-MM-dd");
37                             File.AppendAllText(fileName + ".txt", ex.ToString(), System.Text.Encoding.UTF8);
38                         }
39                         else
40                         {
41                             //如果队列中没有数据 休闲 3000
42                             Thread.Sleep(3000);
43                         }
44                     }
45                     else
46                     {
47                         //如果队列中没有数据 休闲 3000
48                         Thread.Sleep(3000);
49                     }
50                     
51                 }
52             },filePath);
53         }
54     }
55 }
View Code

4.1、使用线程池ThreadPool中的QueueUserWorkItem方法,QueueUserWorkItem有两个重载,F12查看。

4.2如果队列中没有数据,则休息Thread.Sleep(3000);

5、新建一个控制器Test。进行测试

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace WebApp.Controllers
 8 {
 9     public class TestController : Controller
10     {
11         //
12         // GET: /Test/
13         public ActionResult Index()
14         {
15             return View();
16         }
17         public ActionResult ShowResult()
18         {
19             int a = 2;
20             int b = 0;
21             int c = a / b;
22             return Content(c.ToString());
23         }
24     }
25 }
View Code

   至于Log4net ,我想有空再把具体写下来,记录记录。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:ASP.NET使用Ajax返回Json对象

下一篇:.net Elasticsearch 学习入门笔记