用队列的方式实现日志

下列的实例中:(怎么捕获异常,webform和asp.net MVC不太一样后者提供了一个全局的一场处理过滤器。MyExceptionAttribute是我们自己定义的过滤器,继承了HandleErrorAttrbute 。有异常就会执行OnException这个方法。)

日志记录功能。
一般日志是写在文件里
多线程操作文件导致并发。
队列就是内存当中的一个集合,先进先出
Global中有一个方法叫Application_Error(),只要发生异常,就会执行这个方法。Application_Start()是在程序一开始就会运行

.netFramework提供队列的集合。
public static Queue<Exception> e=new Queue<Exception>

 

 

步骤:当第一次请求应用程序的时候,运行Application_start();的时候注册一个自己定义的异常过滤器。

 

Application_start(){ //程序一运行的时候

FilerConfig.RegisterGlobalFilters(GlobalFilters.Filters) //注册了我们自己定义的一个异常过滤器
}

 


public class FilterConfig
{
  public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  {
    filters.Add(new MyExceptionAttribute)
  }
}

 

自己定义的异常过滤器

public class MyExceptionAttribute:HandleErrorAttrbute
{
  public static Queue<Exception> ExceptionQueue=new Queue<Exception> //声明一个队列
  public override void OnException(ExceptionContext filterconter) //抛异常就会执行这个方法
  {
    base.onException(filterconter);
    ExceptionQueue(filetercontext.Exception) //将异常信息添加到队列中。
    filterContext.HttpContext.Response.Redirect("/Error.html");
  }


}

下面就是用线程池从队列中拿数据往文件里面写
protected void Application_Start()

 {

  string fileLogPath=Server.MapPath("/Log/");
  ThreadPool.QueueUserworkItem((a)=> //拉姆达表达式
  {

    while(true)
    {
    if(MyExceptionAttribute.ExceptionQueue.Count>0)
      {
        Exception ex=MyExceptionAttribute.ExceptionQueue.Dequeue()//出队,先进先出
        string fileName=DataTime.Now.Tostring("yyyy-mm-dd")+".txt";
        File.AppendAllText(fileLogPath+fileName,ex.ToString(),System.Text.Encoding.Default)
      }
    else{ Thread.Sleep(3000);如果队列中没有数据,休息 }
     }

  },fileLogPath);

   }

 

 

总之:就是把错误写入队列,然后开一个线程池,无线循环的读取队列中的值,如果有的话就写入文本,没有的话就睡觉。

posted @ 2017-02-18 18:45  二环东路  阅读(1254)  评论(0编辑  收藏  举报