用队列的方式实现日志

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

   }

 

 

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

转载于:https://www.cnblogs.com/liuwenxu/p/6413834.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
kafka消息队列实现了一个分布式、分区、复制和容错的事件流平台,专门为分布式高吞吐量系统而设计的消息传递系统。它具有以下特点: 1. 可靠性:kafka使用分布式提交日志来保证消息的可靠性,尽可能快地将消息保留在磁盘上,从而实现持久化存储。 2. 可扩展性:kafka的消息传递系统可以轻松地进行水平扩展,无需停机,可以处理大规模的消息程序。 3. 耐用性:kafka支持分布式复制和多副本备份,保证消息在发生故障时不丢失。 4. 高性能:kafka对于发布-订阅消息具有高吞吐量,即使在存储了大量消息的情况下,也能保持稳定的性能。 5. 解耦和削峰:kafka的架构可以解耦生产者和消费者,实现异步处理,同时还能够平滑处理流量峰值。 对于kafka的消息队列实现,关键的概念是实现broker的去重,以实现消息发送的幂等性。为了实现幂等性,kafka引入了两个概念,并使用发布-订阅消息系统。消息被保留在主题中,消费者可以订阅一个或多个主题,并使用该主题中的所有消息。这使得kafka在分布式系统中具有更好的消息处理能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [kafka消息队列](https://blog.csdn.net/qq_43067962/article/details/118485833)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值