log4net-错误日志抛出

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


简介


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


配置配置文件

<configuration>
  <configSections>
<!-- Log4Net配置声明了这么一个类型的log4net块用来解析下面的<log4net>节点-->
    <section name="log4net" type ="log4net.Config.Log4NetConfigurationHandler,log4net"/>
  </configSections>
  <log4net>
    <!--错误级别共有这么多从小到大依次是OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL 
     Set root logger level to ERROR and its appenders -->
    <root>
      <level value="ALL"/>
      <appender-ref ref="SysAppender"/>
    </root>

    <!--定义Web错误日志生成器的级别 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" >
<!--文件存放的位置,App_Data是一个内部方位文件夹安全级别高,value可以随意指定 -->
 <param name="File" value="App_Data/" /> 
<!--是否将错误往文件里附加,是就将错误日志附加到指定路径下-->
 <param name="AppendToFile" value="true" />
<!--回滚方式,我在这里用的是日期回滚,还可以一大小进行回滚-->
 <param name="RollingStyle" value="Date" />
<!--回滚模式,基本相当于给错误文件命名,格式随意-->
<param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" />
<!--是否静态生成文件名,很明显回滚模式是动态生成的,所以选了false-->
 <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="----------------------header--------------------------" />
<param name="Footer" value="----------------------footer--------------------------" />
 </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>


设置路由初始化(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<string> ExcMsg;
      static LogHelper()
      {
          ExcMsg = new Queue<string>();
          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);
          }
 
      }
    }
   

}


总结:

       

        慢慢来吧



评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值