博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis——Redis与Log4Net完成了分布式日志记录
阅读量:6893 次
发布时间:2019-06-27

本文共 6323 字,大约阅读时间需要 21 分钟。

一,思路

           为了单独记录我们程序中各种异常,我们这样做:创建一个队列,当出现异常的时候,将异常放入到队列中,另外,我们在程序启动时,开启一个线程,用来从存放异常的队列中取得异常信息,进行写入文件。

        模拟代码:

                自定义异常出现时候的处理类:

                      

public class MyExceptionAttribute:System.Web.Mvc.HandleErrorAttribute    {        //存放异常的队列        public static Queue
exceptionQueue = new Queue
(); /*处理异常信息*/ public override void OnException(System.Web.Mvc.ExceptionContext filterContext) { exceptionQueue.Enqueue(filterContext.Exception); //将异常信息入队 filterContext.HttpContext.Response.Redirect("/error.html");//跳转到错误页 base.OnException(filterContext); } }

           修改filterConfig中的方法(当出现异常时候,将异常交给我们的自定义类进行处理):

public static void RegisterGlobalFilters(GlobalFilterCollection filters)        {           // filters.Add(new HandleErrorAttribute());            filters.Add(new MyExceptionAttribute());        }

        

     修改应用程序入口方法:

        

protected void Application_Start()        {            AreaRegistration.RegisterAllAreas();            WebApiConfig.Register(GlobalConfiguration.Configuration);            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);            RouteConfig.RegisterRoutes(RouteTable.Routes);            BundleConfig.RegisterBundles(BundleTable.Bundles);            //通过线程池开启一个线程,然后不停地从队列中获取数据            String logPath = Server.MapPath("/Log/");            ThreadPool.QueueUserWorkItem(o => {                while (true)                {                    try                    {                        if (MyExceptionAttribute.exceptionQueue.Count > 0)                        {                            Exception e=MyExceptionAttribute.exceptionQueue.Dequeue();//从队列中拿出数据                            if (e != null)                            {                                //构建日志的完整路径                                String fileName = logPath + DateTime.Now.ToString("yyyy-MM-dd")+".txt";                                string errorMsg = e.ToString();                                File.AppendAllText(fileName,errorMsg,Encoding.Default);//异常写入文件                            }                            else                            {                                Thread.Sleep(30);                            }                        }                        else                        {                            Thread.Sleep(30);//避免cpu空转                        }                    }                    catch(Exception e)                    {                        MyExceptionAttribute.exceptionQueue.Enqueue(e);                    }                                                      }            }, logPath);        }    }

二,使用redis做异常信息队列,使用log4net进行日志处理

   在大型网站中,我们将异常信息队列从应用程序服务器中分离开来,在这里,使用redis存放我们的异常信息,但产生异常信息之后,将异常信息交给我们的log4net处理。

     

      修改队列:

public class MyExceptionAttribute:System.Web.Mvc.HandleErrorAttribute    {        //存放异常的队列       // public static Queue
exceptionQueue = new Queue
(); public static IRedisClientsManager clientManager = new PooledRedisClientManager(new String[]{"127.0.0.1:6379"}); public static IRedisClient reidsClient = clientManager.GetClient(); /*处理异常信息*/ public override void OnException(System.Web.Mvc.ExceptionContext filterContext) { //exceptionQueue.Enqueue(filterContext.Exception); //将异常信息入队 reidsClient.EnqueueItemOnList("exception", filterContext.Exception.ToString());//将异常信息存储到redis队列中 filterContext.HttpContext.Response.Redirect("/error.html");//跳转到错误页 base.OnException(filterContext); } }

   

        改用log4net处理错误信息:

      

protected void Application_Start()        {            log4net.Config.XmlConfigurator.Configure();//获取log4net配置信息(具体配置在web.config中)            AreaRegistration.RegisterAllAreas();            WebApiConfig.Register(GlobalConfiguration.Configuration);            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);            RouteConfig.RegisterRoutes(RouteTable.Routes);            BundleConfig.RegisterBundles(BundleTable.Bundles);            //通过线程池开启一个线程,然后不停地从队列中获取数据            String logPath = Server.MapPath("/Log/");            ThreadPool.QueueUserWorkItem(o => {                while (true)                {                    try                    {                       // if (MyExceptionAttribute.exceptionQueue.Count > 0)                        if (MyExceptionAttribute.reidsClient.GetListCount("exception") > 0)                        {                            //Exception e=MyExceptionAttribute.exceptionQueue.Dequeue();//从队列中拿出数据                            String errorMsg = MyExceptionAttribute.reidsClient.DequeueItemFromList("exception"); //从redis中取出异常信息数据                            if (errorMsg != null)                            {                                //构建日志的完整路径                               // String fileName = logPath + DateTime.Now.ToString("yyyy-MM-dd")+".txt";                               // string errorMsg = e.ToString();                              //  File.AppendAllText(fileName, errorMsg, Encoding.Default);//异常写入文件                                /*使用log4net进行写入错误信息*/                                ILog logger = LogManager.GetLogger("appError");                                logger.Error(errorMsg);//将异常信息写入log4net中                            }                            else                            {                                Thread.Sleep(30);                            }                        }                        else                        {                            Thread.Sleep(30);//避免cpu空转                        }                    }                    catch(Exception e)                    {                        MyExceptionAttribute.reidsClient.EnqueueItemOnList("exception", e.ToString());//将异常信息存储到redis队列中                    }                                                      }            }, logPath);        }    }

ps:log4net配置文件:

处理节点配置:

   在网站正常使用中,我们的redis服务器一般是跟我们的应用服务器分离开的,这样我们的队列就不占用应用服务器的资源了,再扩展,我们的日志也可以单独从应用服务器剥离开来,做到服务器专用。

 

    

转载地址:http://wkudl.baihongyu.com/

你可能感兴趣的文章
分析师齐声唱多Facebook:发展势头凶猛 势不可挡
查看>>
Hadoop中ssh+IP、ssh+别名免秘钥登录配置
查看>>
安防设备需求爆发
查看>>
毫秒级大数据算法让生物识别取代密码
查看>>
找云合作伙伴 来云生态峰会
查看>>
八百客观点:如何让业务员对CRM爱不释手?
查看>>
泛微年报-OA行业第一家上市公司解读
查看>>
紫光集团已收购武汉新芯大多数股权
查看>>
恶意程序使用路由器 LED 灯从安全网络窃取数据
查看>>
智齿科技携手无忧我房 VR+AI新品亮相GTC
查看>>
中国已成全球七大重要出版市场之一 大数据提供新机遇
查看>>
法街头“种”下电子树 可提供WiFi、为手机充电
查看>>
《中国大数据企业评级白皮书》出炉
查看>>
联想否认锁住设备以及阻止用户安装Linux
查看>>
“任意云”再创佳绩 戴尔赢得CEIA最佳混合云方案提供商
查看>>
Facebook正式上线视频直播:APP充当电视直播间
查看>>
深圳将实现窄带物联网商用全覆盖 深入19大行业应用
查看>>
大数据也是一把双刃剑
查看>>
抢物联网商机 中国三大电信商掀战火
查看>>
应用领域寸土寸金 大数据成为新一代“网红”?
查看>>