分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

redis队列结合log4net实现异常日志记录

发布时间:2023-09-06 01:54责任编辑:顾先生关键词:redis

  查看了一些关于mvc异常日志记录的文章,发现使用redis+log4net的最多,这里简单总结了使用这种方式实现日志记录的过程。直接上步骤:

  第一步:配置redis服务器

    参考redis的配置和在.net中的使用

  第二步:添加自己的异常过滤器(Models文件夹添加一个MyExceptionAttribute类)

 1 ?public class MyExceptionAttribute : HandleErrorAttribute 2 ????{ 3 ????????//----所有用户出现异常,向同一个静态队列添加数据 4 ????????//public static Queue<Exception> exQueue = new Queue<Exception>();//不用redis时,用一个普通的队列保存异常 5 ?6 ????????//----使用redis队列保存异常 7 ????????//获取redis的client实例 8 ????????public static IRedisClientsManager clientManager = new PooledRedisClientManager(new string[] { "127.0.0.1:6379", "10.122.0.1" }); 9 ????????public static IRedisClient redisClient = clientManager.GetClient();10 11 ????????//AOP方式 在出现异常时把异常信息记入到redis队列中12 ????????public override void OnException(ExceptionContext filterContext)13 ????????{14 ????????????base.OnException(filterContext);15 ????????????Exception ex = filterContext.Exception;16 ????????????//普通队列记录:exQueue.Enqueue(ex);17 ????????????redisClient.EnqueueItemOnList("excpList", ex.ToString());//异常记入到redis队列18 19 ????????????//指定filterContext.Result不会执行后续Action中代码(下边给了两种提示用户出错的方式) ?????????20 ????????????//filterContext.Result = new ContentResult() { Content = "<script>alert(‘出错了!‘)</script>" };//弹出框提示21 ????????????filterContext.Result = new RedirectResult("/error.html");//跳转到错误页22 23 ????????????filterContext.ExceptionHandled = true;//告诉服务器异常已处理,可以执行result了!
         //不加这句服务器会继续进行异常的处理,没有为异常配置错误页时跳转到错误黄页(使用这种方法一般不需要在config文件中配置错误页,因为不进入内置的异常处理程序)24 ????????}25 ????}

   第三步:设置全局过滤器。也可以对指定Controller或Action添加特性标签,在记录异常时最好配置为全局过滤器

 public class FilterConfig ???{ ???????public static void RegisterGlobalFilters(GlobalFilterCollection filters) ???????{ ???????????//把自定义异常处理过滤器设为全局 ???????????filters.Add(new MyExceptionAttribute()); ???????} ???}

  第四步:配置global文件

 1 ?protected void Application_Start() 2 ????????{ 3 ????????????log4net.Config.XmlConfigurator.Configure();//获取Log4Net配置信息(配置信息定义在Web.config文件中) 4 ????????????AreaRegistration.RegisterAllAreas(); 5 ????????????FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 6 ????????????RouteConfig.RegisterRoutes(RouteTable.Routes); 7 ????????????BundleConfig.RegisterBundles(BundleTable.Bundles); 8 ????????????//通过线程不停的从队列获取异常信息 9 ????????????ThreadPool.QueueUserWorkItem(x =>10 ????????????{11 ????????????????while (true)12 ????????????????{13 ????????????????????try14 ????????????????????{15 ????????????????????????if (MyExceptionAttribute.redisClient.GetListCount("excpList") > 0)16 ????????????????????????{17 ????????????????????????????// ?Exception ?ex= MyExecptionAttribute.ExceptionQueue.Dequeue();//从队列中拿出数据18 ????????????????????????????string errorMsg = MyExceptionAttribute.redisClient.DequeueItemFromList("excpList");//从Redis队列中取出异常数据19 ????????????????????????????if (!string.IsNullOrEmpty(errorMsg))20 ????????????????????????????{21 ????????????????????????????????//将异常信息写到Log4Net中.22 ????????????????????????????????ILog logger = LogManager.GetLogger("ErrorLog");23 ????????????????????????????????logger.Error(errorMsg);24 ????????????????????????????}25 ????????????????????????????else26 ????????????????????????????{27 ????????????????????????????????Thread.Sleep(1000);28 ????????????????????????????}29 ????????????????????????}30 ????????????????????????else31 ????????????????????????{32 ????????????????????????????Thread.Sleep(1000);//设置记录间隔1秒33 ????????????????????????}34 ????????????????????}35 ????????????????????catch (Exception ex)36 ????????????????????{37 ????????????????????????//记录出现异常也写入redis异常队列中38 ????????????????????????MyExceptionAttribute.redisClient.EnqueueItemOnList("excpList", ex.ToString());39 ????????????????????}40 ????????????????}41 ????????????});//callback--end42 ????????}//--线程end

  下边是log4net的配置信息(来源:https://blog.csdn.net/zhulongxi/article/details/73550076)

<configuration> ?<configSections> ???<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> ?</configSections> ???<log4net> ???<root> ?????<level value="ALL"/> ?????<appender-ref ref="SysAppender"/> ???</root> ???<!-- Print only messages of level DEBUG or above in the packages --> ???<logger name="WebLogger"> ?????<level value="DEBUG"/> ???</logger> ???<appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" > ?????<param name="File" value="App_Data/" /> ?????<!--日志文件位置--> ?????<param name="AppendToFile" value="true" /> ?????<!--文件追加--> ?????<param name="RollingStyle" value="Date" /> ?????<!--回滚:按照日期--> ?????<param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" /> ?????<!--文件名--> ?????<param name="StaticLogFileName" value="false" /> ?????<!--文件名为非静态--> ?????<layout type="log4net.Layout.PatternLayout,log4net"> ???????<!--信息格式--> ???????<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> ???????<param name="Header" value="&#13;&#10;----------------------header--------------------------&#13;&#10;" /> ???????<param name="Footer" value="&#13;&#10;----------------------footer--------------------------&#13;&#10;" /> ?????</layout> ???</appender> ???<appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net"> ?????<layout type="log4net.Layout.PatternLayout,log4net"> ???????<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> ?????</layout> ???</appender> ?</log4net></configuration>

  通过以上4个步骤就可以完成redis队列+log4net异常记录的实现,日志文件存储在App_Data目录下。

参考文章:

  1、https://blog.csdn.net/wziyx513225244/article/details/6628627 

  2、https://blog.csdn.net/zhulongxi/article/details/73550076 

redis队列结合log4net实现异常日志记录

原文地址:https://www.cnblogs.com/wyy1234/p/9050346.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved