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

using ServiceStack.Redis;

namespace 分布式日志
{
    public class MyExceptionFilter : HandleErrorAttribute
    {
        #region 用c#的队列
        //public static Queue<Exception> listQueue = new Queue<Exception>();
        //public override void OnException(ExceptionContext filterContext)
        //{
        //    if (filterContext.Exception!=null)
        //    {
        //        listQueue.Enqueue(filterContext.Exception);
        //        filterContext.HttpContext.Response.Redirect("/error.html");
        //    }
        //    base.OnException(filterContext);
        //}
        #endregion

        #region 用redis的队列
        public static IRedisClientsManager clientsManager=new PooledRedisClientManager(new string[]{"127.0.0.1:6379"});
        public static IRedisClient redisClient=clientsManager.GetClient();
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.Exception != null)
            {
                redisClient.EnqueueItemOnList("exception",filterContext.Exception.ToString());//入队
                filterContext.HttpContext.Response.Redirect("/error.html");
            }
            base.OnException(filterContext);
        }
        #endregion
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace 分布式日志
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            //通过线程池开启一个线程,然后不停的从队列中读取数据
            string strRoot = Server.MapPath("/Log/");
            string strPath = strRoot + DateTime.Now.ToString("yyyy-MM-dd").ToString()+".txt";
            ThreadPool.QueueUserWorkItem(i =>
            {
                while (true)
                {
                    #region c# 队列
                    //try
                    //{
                    //    if (MyExceptionFilter.listQueue.Count > 0)
                    //    {
                    //        Exception ex = MyExceptionFilter.listQueue.Dequeue();
                    //        if (ex != null)
                    //        {
                    //            System.IO.File.AppendAllText( strPath,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ex.ToString() + Environment.NewLine,System.Text.Encoding.UTF8);
                    //        }
                    //        else
                    //        {
                    //            Thread.Sleep(30);
                    //        }
                    //    }
                    //    else
                    //    {
                    //        Thread.Sleep(30);//避免cpu空转
                    //    }
                    //}
                    //catch(Exception ex)
                    //{
                    //    MyExceptionFilter.listQueue.Enqueue(ex);
                    //}
                    #endregion

                    #region redis 队列
                    string strKey = "exception";
                    try
                    {
                        )
                        {
                            string strMsg = MyExceptionFilter.redisClient.DequeueItemFromList(strKey);
                            if (!string.IsNullOrEmpty(strMsg))
                            {
                                System.IO.File.AppendAllText(strPath, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + strMsg + Environment.NewLine, System.Text.Encoding.UTF8);
                            }
                            else
                            {
                                Thread.Sleep();
                            }
                        }
                        else
                        {
                            Thread.Sleep();//避免cpu空转
                        }
                    }
                    catch (Exception ex)
                    {
                        MyExceptionFilter.redisClient.EnqueueItemOnList(strKey, ex.ToString());
                    }
                    #endregion
                }
            }, strPath);
        }
    }
}
using System.Web;
using System.Web.Mvc;

namespace 分布式日志
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
            filters.Add(new MyExceptionFilter());
        }
    }
}

分布式日志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. Notepad++快捷键&正则表达式替换字符串&插件

    Notepad++绝对是windows下进行程序编辑的神器之一,要更快速的使用以媲美VIM,必须灵活掌握它的快捷键,下面对notepad++默认的快捷键做个整理(其中有颜色的为常用招数): 1. 文件 ...

  2. Python中super函数的用法

    之前看python文档的时候发现许多单继承类也用了super()来申明父类,那么这样做有何意义? 从python官网文档对于super的介绍来看,其作用为返回一个代理对象作为代表调用父类或亲类方法.( ...

  3. Android Gradle 技巧之二: 最爱命令行

    命令行 很多做 Android 开发不久的同学,习惯于使用图形界面,对命令行操作很陌生甚至恐惧.遇到 AS 运行错误,束手无策.AS 为了确保易用性,也在 UI 界面上屏蔽了很多命令行运行的细节,导致 ...

  4. 使用input=file上传

    前台,form的target指向iframe <form action="/EmailHandler.ashx?action=upload" id="form1&q ...

  5. 61. Unique Paths && Unique Paths II

    Unique Paths A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagra ...

  6. window7下使用vagrant打造lamp开发环境(一)

    前言: 公司电脑只有win7 + (xampp || wamp)开发,处于个人爱好,想学习下在最舒服的开发环境下开发,也不想安装双系统,想用Vmware电脑却配置不高,vagrant+virtual ...

  7. sencha touch 入门系列 (二)sencha touch 开发准备

    这是本人第一次写博客教程,没什么经验,文笔也不是很好,写这教程一方面为了巩固自己这段时间的学习成果,一方面帮助大家解决问题,欢迎大家多提建议,指出问题.接下来我们就开始我们的sencha touch开 ...

  8. 洛谷P3373 【模板】线段树 2

     P3373 [模板]线段树 2 47通过 186提交 题目提供者HansBug 标签 难度提高+/省选- 提交  讨论  题解 最新讨论 为啥WA(TAT) 题目描述 如题,已知一个数列,你需要进行 ...

  9. ffmpeg - libavutil/attribute.h

    在ffmpeg中,这个文件被很多其他的文件所包含.该文件中定义了一些gcc中支持的语言扩展的宏, 例如强制内联,外部内联,pure函数等.并根据是否使用了GCC,以及GCC的版本,把宏转换为 相应的编 ...

  10. 使用imap协议接收邮件

    之前一直使用PHPMail类进行发送邮件,这个是一个非常强大的类,但是其实底层就是使用mail()函数来进行发送的. 但是现在公司有个需求是  写个程序需要实时的接收邮件,主要是判断邮件发出去了,并且 ...