码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2018-05-17 13:58:36      阅读:368      评论:0      收藏:0      [点我收藏+]

标签:redis服务器   AC   ges   代码   tar   date   user   ror   prot   

  查看了一些关于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                     try
14                     {
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                             else
26                             {
27                                 Thread.Sleep(1000);
28                             }
29                         }
30                         else
31                         {
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--end
42         }//--线程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实现异常日志记录

标签:redis服务器   AC   ges   代码   tar   date   user   ror   prot   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!