用队列的方式实现日志

摘要:
)日志记录功能。一般日志是写在文件里多线程操作文件导致并发。队列就是内存当中的一个集合,先进先出Global中有一个方法叫Application_Error(),只要发生异常,就会执行这个方法。Application_Start()是在程序一开始就会运行.netFramework提供队列的集合。publicstaticQueuee=newQueue步骤:当第一次请求应用程序的时候,运行Application_start();的时候注册一个自己定义的异常过滤器。

下列的实例中:(怎么捕获异常,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);

}

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

免责声明:文章转载自《用队列的方式实现日志》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇多属性决策iview下拉树组件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

【转】QImage 图像格式小结

构造图像:,QImagemyImage1=QImage;根据文件名打开图像。如果图像本身是32位或24位,则程序中的图像是32位。如果图像本身是8位或1位,则程序中的对应图像是8位或者1位。宽度表示图像宽度,高度表示图像高度。...

kafka命令

启动kafka:./kafka-server-start.sh../config/server.properties&查看topic./kafka-topics.sh--zookeeper192.168.8.56:2181,192.168.8.70:2181,192.168.8.147:2181--describe--topicliuhangjun....

java实现word转pdf文件(高效不失真)

importjava.io.File;importjava.io.FileOutputStream;importjava.io.InputStream;importorg.aspectj.weaver.ast.Test;importcom.aspose.words.Document;importcom.aspose.words.License;importc...

redis忘记密码的情况下重置密码

3.搜索服务,进入系统服务,停止Redis服务。...

android获取Mac地址和IP地址

在实际项目中测试了以下方法以获取Mac地址:(1)设备打开Wifi连接并获取网卡的Mac地址(但不打开Wifi,无法获取Mac地址。此方法也是网络上最常用的方法)//本地MacpublicstaticStringgetLocalMacAddressFromWifiInfo(Contextcontext){WifiManagerwifi=(WifiManage...

Qt HWND的句柄与QWidget的转换

QT中使用hwnd的句柄在编程中遇到问题。第三方API使用HWND类型作为正式参数,但该类型在QT中不可用。您可以执行以下操作来解决问题。首先声明:HWNDm in。h-hWnd;然后声明1public:2QWidget*newWidget;在In-cpp中,newWidget=QWidget::find//您需要将QWidget转换为HWND1QWidge...