用队列的方式实现日志
下列的实例中:(怎么捕获异常,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);
}
总之:就是把错误写入队列,然后开一个线程池,无线循环的读取队列中的值,如果有的话就写入文本,没有的话就睡觉。