• 利用队列记录错误日志


    日志是给程序猿看的。

    具体步骤:

    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 ,我想有空再把具体写下来,记录记录。

    一个机械设计及其自动化专业自学转入编程世界的少年。 学习、分享、总结。个人小站www.isoftvip.com
  • 相关阅读:
    span设置宽和高当没有内容的时候也可撑开
    span设置宽和高当没有内容的时候也可以撑开
    块级元素以及内联元素大总结
    内存泄露问题
    Sqlcompletefree
    运用SET ANSI_PADDING OFF创建某个字段为自增列的表,以及插入数据
    Sql Server中通配符
    sql server 2008查询窗口怎么显示行数
    sql server 2008语句中的go有什么用?
    SQL Server 2008 R2[ALTER]列属性修改
  • 原文地址:https://www.cnblogs.com/qq1981684148/p/6892619.html
Copyright © 2020-2023  润新知