1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6.  
  7. using ServiceStack.Redis;
  8.  
  9. namespace 分布式日志
  10. {
  11. public class MyExceptionFilter : HandleErrorAttribute
  12. {
  13. #region 用c#的队列
  14. //public static Queue<Exception> listQueue = new Queue<Exception>();
  15. //public override void OnException(ExceptionContext filterContext)
  16. //{
  17. // if (filterContext.Exception!=null)
  18. // {
  19. // listQueue.Enqueue(filterContext.Exception);
  20. // filterContext.HttpContext.Response.Redirect("/error.html");
  21. // }
  22. // base.OnException(filterContext);
  23. //}
  24. #endregion
  25.  
  26. #region 用redis的队列
  27. public static IRedisClientsManager clientsManager=new PooledRedisClientManager(new string[]{"127.0.0.1:6379"});
  28. public static IRedisClient redisClient=clientsManager.GetClient();
  29. public override void OnException(ExceptionContext filterContext)
  30. {
  31. if (filterContext.Exception != null)
  32. {
  33. redisClient.EnqueueItemOnList("exception",filterContext.Exception.ToString());//入队
  34. filterContext.HttpContext.Response.Redirect("/error.html");
  35. }
  36. base.OnException(filterContext);
  37. }
  38. #endregion
  39. }
  40. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading;
  5. using System.Web;
  6. using System.Web.Mvc;
  7. using System.Web.Optimization;
  8. using System.Web.Routing;
  9.  
  10. namespace 分布式日志
  11. {
  12. public class MvcApplication : System.Web.HttpApplication
  13. {
  14. protected void Application_Start()
  15. {
  16. AreaRegistration.RegisterAllAreas();
  17. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  18. RouteConfig.RegisterRoutes(RouteTable.Routes);
  19. BundleConfig.RegisterBundles(BundleTable.Bundles);
  20.  
  21. //通过线程池开启一个线程,然后不停的从队列中读取数据
  22. string strRoot = Server.MapPath("/Log/");
  23. string strPath = strRoot + DateTime.Now.ToString("yyyy-MM-dd").ToString()+".txt";
  24. ThreadPool.QueueUserWorkItem(i =>
  25. {
  26. while (true)
  27. {
  28. #region c# 队列
  29. //try
  30. //{
  31. // if (MyExceptionFilter.listQueue.Count > 0)
  32. // {
  33. // Exception ex = MyExceptionFilter.listQueue.Dequeue();
  34. // if (ex != null)
  35. // {
  36. // System.IO.File.AppendAllText( strPath,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ex.ToString() + Environment.NewLine,System.Text.Encoding.UTF8);
  37. // }
  38. // else
  39. // {
  40. // Thread.Sleep(30);
  41. // }
  42. // }
  43. // else
  44. // {
  45. // Thread.Sleep(30);//避免cpu空转
  46. // }
  47. //}
  48. //catch(Exception ex)
  49. //{
  50. // MyExceptionFilter.listQueue.Enqueue(ex);
  51. //}
  52. #endregion
  53.  
  54. #region redis 队列
  55. string strKey = "exception";
  56. try
  57. {
  58. )
  59. {
  60. string strMsg = MyExceptionFilter.redisClient.DequeueItemFromList(strKey);
  61. if (!string.IsNullOrEmpty(strMsg))
  62. {
  63. System.IO.File.AppendAllText(strPath, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + strMsg + Environment.NewLine, System.Text.Encoding.UTF8);
  64. }
  65. else
  66. {
  67. Thread.Sleep();
  68. }
  69. }
  70. else
  71. {
  72. Thread.Sleep();//避免cpu空转
  73. }
  74. }
  75. catch (Exception ex)
  76. {
  77. MyExceptionFilter.redisClient.EnqueueItemOnList(strKey, ex.ToString());
  78. }
  79. #endregion
  80. }
  81. }, strPath);
  82. }
  83. }
  84. }
  1. using System.Web;
  2. using System.Web.Mvc;
  3.  
  4. namespace 分布式日志
  5. {
  6. public class FilterConfig
  7. {
  8. public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  9. {
  10. //filters.Add(new HandleErrorAttribute());
  11. filters.Add(new MyExceptionFilter());
  12. }
  13. }
  14. }

分布式日志2 用redis的队列写日志的更多相关文章

  1. 分布式日志1 用c#的队列写日志

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  2. 重复造轮子,编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)

    一说到写日志,大家可能推荐一堆的开源日志框架,如:Log4Net.NLog,这些日志框架确实也不错,比较强大也比较灵活,但也正因为又强大又灵活,导致我们使用他们时需要引用一些DLL,同时还要学习各种用 ...

  3. python 14篇 写日志

    import sys from loguru import logger # 日志级别: debug 调试信息打印日志比较详细,级别最低 # info 正常的提示信息,级别较低 # waring 警告 ...

  4. Redis 自定义 RedisAppender 插件, 实现日志缓冲队列,集中日志输出.

    因为某些异步日志设置了即使队列满了,也不可丢弃,在并发高的时候,导致请求方法同步执行,响应变慢. 编写这个玩意,除了集中日志输出以外,还希望在高并发的时间点有缓冲作用. 之前用Kafka实现了一次入队 ...

  5. 利用StackExchange.Redis和Log4Net构建日志队列

    简介:本文是一个简单的demo用于展示利用StackExchange.Redis和Log4Net构建日志队列,为高并发日志处理提供一些思路. 0.先下载安装Redis服务,然后再服务列表里启动服务(R ...

  6. java-spring基于redis单机版(redisTemplate)实现的分布式锁+redis消息队列,可用于秒杀,定时器,高并发,抢购

    此教程不涉及整合spring整合redis,可另行查阅资料教程. 代码: RedisLock package com.cashloan.analytics.utils; import org.slf4 ...

  7. c# 多线程使用队列顺序写日志的类 (需要再优化)

    using System; using System.Collections.Generic; using System.Threading; public class LogManager { // ...

  8. Docker部署Django项目+Nginx+Fluend日志收集 和redis、memcached、RabbitMQ、Celery

    前言 一.docker 1.docker是什么? Docker的英文本意是“搬运工”,Docker搬运的是集装箱(Container)可以成为容器,我可以把写的Django的WEB应用以及Python ...

  9. ELK(+Redis)-开源实时日志分析平台

    ################################################################################################### ...

随机推荐

  1. yum安装rz和sz

    yum install lrzsz

  2. eclipse下tomcat插件配置说明

  3. 发送SMS短信(JSON) 转载

    http://blog.csdn.net/ldl22847/article/details/42553883 public   static string GetMobileConfByUserId( ...

  4. SQL语句 DML,DDL,DCL

    数据控制语言(DCL)是用来设置或者更改数据库用户或角色权限的语句,这些语句包括GRANT.DENY.REVOKE等语句,在默认状态下,只有 sysadmin.dbcreator.db_owner或d ...

  5. 设置arc/非arc

    1,选择项目中的Targets,选中你所要操作的Target,2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,     并在输入框中输入:-fobjc- ...

  6. Symfony2 资料篇

    http://www.chrisyue.com/symfony2-in-action-day-1.html 由于Symfony2现在还没有很完善的中文文档,所以不想看文档的同学可以直接进行点击上面的链 ...

  7. MySQL安装过程net start mysql 启动失败 报“错误2,系统找不到文件”的解决办法

    MySQL安装过程net start mysql 启动失败 报“错误2,系统找不到文件”的解决办法 错误2,系统找不到文件. 开始...运行... regedit  注册表项: HKEY_LOCAL_ ...

  8. 删除sde用户问题

    删除SDE用户(GIS地图数据用户),长时间删除没反应,结束drop user sde cascade命令后,重新执行,结果报ORA-00604 ORA-21700 select user_id,us ...

  9. Oracle客户端与服务器字符集不统一的处理

    当Oracle客户端与服务器的字符集不统一时. 症状: 如:ORA-00283: ?????????? 提示信息中有好多问号. 解决方法: 1查询服务器的字符集: SQL> conn / as ...

  10. Linux C学习笔记06--Tlist使用(编程工具篇)

    为了方便用VIM编程,安装了一个方便的小工具 taglist,下面是taglist使用的一些说明. 常用的taglist配置选项,可以根据自己的习惯进行配置: Tlist_Ctags_Cmd选项用于指 ...