log4net-错误日志抛出

        之前在这篇博客中已经介绍过两种抛出错误日志的方法了,这次在分享一个log4net错误日志抛出法,这个与之前不同的是,这个不需要调用可以自动捕捉错误,相对的多做的一点就是要提前配置好log4net并添加该引用


简介


        LogNet是用来记录日志的,可以将程序运行过程中的信息输出到一些地方,日志就是程序的黑匣子,可以通过日志查看系统的运行过程, 从而发现系统的问题


配置配置文件


  

    
 


设置路由初始化(global)


 protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            // 默认情况下对 Entity Framework 使用 LocalDB
            Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0;
           Integrated Security=True; MultipleActiveResultSets=True");

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
            //让log4net配置节点起作用,可以看到我注释了一行,这是应为有了注释的这句log4net的配置就可
            以生效,但如果要放到配置指定的路径下还要写出路径
           //log4net.Config.XmlConfigurator.Configure();
            log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo
            (Server.MapPath("~/Web.config"))); 
        }
        public void Application_Error(object send, EventArgs e)
        {
            //记录日志
            Exception ex = Server.GetLastError();

            string errorMsg = ex.ToString();

            //日志可d能写到多个地方去,这是把错误信息放到自己规定的类里面去,在logHelper里可以看见
            这个方法
            DAL.LogHelper.WriteLog(errorMsg);

            //跳到错误页或者跳转
           // Response.Redirect("/Error.html");
        }



        猜测为什么要写到global里面?

        这个和global.asax文件的作用是有关的,一个关键字Application,具体详解请见这篇博客global.asax


编写logHelper


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
using System.Threading.Tasks;
using System.Threading;
namespace DAL
{
  public  class LogHelper
    {
      //异常消息队列
      public static Queue ExcMsg;
      static LogHelper()
      {
          ExcMsg = new Queue();
          ThreadPool.QueueUserWorkItem(u =>
              {
                  while (true)
                  {
                      string str = string.Empty;
                      if (ExcMsg == null)
                      {
                          continue;
                      }
                      lock (ExcMsg)
                      {
                          if(ExcMsg.Count>0)
                          str = ExcMsg.Dequeue();
                      }
                      if (!string.IsNullOrEmpty(str))
                      {
                          //在这里开始真正的将错误信息写入日志,所以实例化一个日志来盛放错误信息
                         ILog log = log4net.LogManager.GetLogger("Test");
                          log.Error(str);
                      }
                      if (ExcMsg.Count() <= 0)
                      {
                          Thread.Sleep(30);
                      }
                  }
              }
              );                                                               
        
      }
      //定义一个写日志的方法,作用是将接受到的错误信息上锁并放到队列里进行处理
      public static void WriteLog(string msg)
      {
          lock (ExcMsg)
          {
              ExcMsg.Enqueue(msg);
          }
 
      }
    }
   

}


总结:

       

        慢慢来吧



你可能感兴趣的:(学习总结)