首页 > 代码库 > Log4Net与MVC结合的日志处理技术

Log4Net与MVC结合的日志处理技术

我们在开发web项目中,总会遇到一些异常,或是需要记录一些信息。我们也基本都是通过程序写日志的方式,来记录程序的异常信息,以及其他信息。那么今天,我来写了一个Demo分享一下.NET中,关于日志处理的一个技术,Log4Net.下面是自己总结的一些步骤,没有太多理论解释。跟着步骤,即可完成!
    1.添加程序集引用
这当然是必不可少的一步,关于程序集,我们在网上也都能下载! 

2.在models文件夹里面建一个类。MyExceptionAttribute:HandleErrorAttribute(注意:前面为类名,后面为继承的类)内部代码如下
 
public class MyExceptionAttribute:HandleErrorAttribute
    {
        public static Queue<Exception> ExceptionQueue = new Queue<Exception>();//建立一个队列
        public override void OnException(ExceptionContext filterContext)
        {
            base.OnException(filterContext);
            ExceptionQueue.Enqueue(filterContext.Exception);//将异常信息添加到队列中
   filterContext.HttpContext.Response.Redirect("/Error.html");//跳转到错误页面,需要建立一个错误页面
        }
    }

 

 
3.修改App_Start-FilterConfig里面的方法(注释掉原有的类,采用自己刚才创建的类)
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
           // filters.Add(new HandleErrorAttribute());
            filters.Add(new Models.MyExceptionAttribute());//使用自己的类
        }

    

4.设置配置文件的配置信息
注:这里的配置文件,设置了关于之日文件的格式等。我这里是按照日期新建,也就是一天 新建一个文件,一天之内的日志都会记录在同一个文本内
<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
 
<log4net>
<!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
<!-- Set root logger level to ERROR and its appenders -->
<root>
<level value="http://www.mamicode.com/ALL"/>
<appender-ref ref="SysAppender"/>
</root>
 
<!-- Print only messages of level DEBUG or above in the packages -->
<logger name="WebLogger">
<level value="http://www.mamicode.com/DEBUG"/>
</logger>
 
<appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" >
<param name="File" value="http://www.mamicode.com/App_Data/" />
<param name="AppendToFile" value="http://www.mamicode.com/true" />
<param name="RollingStyle" value="http://www.mamicode.com/Date" />
<param name="DatePattern" value="http://www.mamicode.com/"Logs_"yyyyMMdd".txt"" />
<param name="StaticLogFileName" value="http://www.mamicode.com/false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="http://www.mamicode.com/%d [%t] %-5p %c - %m%n" />
<param name="Header" value="http://www.mamicode.com/ ----------------------header-------------------------- " />
<param name="Footer" value="http://www.mamicode.com/ ----------------------footer-------------------------- " />
</layout>
</appender>
<appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="http://www.mamicode.com/%d [%t] %-5p %c - %m%n" />
</layout>
</appender>

</log4net> 

5.在global文件的Application_Start()方法的第一行,添加这个语句 
  log4net.Config.XmlConfigurator.Configure();//读取配置文件中,关于lognet的配置信息具体如下
注:这句代码是读取配置文件中关于lognet的配置信息,必须写在程序的入口处,那自然是global文件下的Application_Start()方法了
6.在global文件下的Application_Start()中添加写日志的代码,如下
  protected void Application_Start()
        {
            log4net.Config.XmlConfigurator.Configure();//读取配置文件中,关于lognet的配置信息
 
            AreaRegistration.RegisterAllAreas();
 
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
 
            string fileLogPath = Server.MapPath("/Log/");
            //线程池
            ThreadPool.QueueUserWorkItem((a) => {
                while (true)
                {
                    if (Models.MyExceptionAttribute.ExceptionQueue.Count() > 0)
                    {
                        Exception ex = Models.MyExceptionAttribute.ExceptionQueue.Dequeue();//出队
                        //创建文件
                        if (ex != null)
                        {
                             ILog logger=LogManager.GetLogger("errorrMsg");//起一个名字
                             logger.Error(ex.ToString());
                        }
                        else
                        {
                            Thread.Sleep(3000);//如果队列中没有消息休息3秒,千万不能少
                        }
                    }
                    else
                    {
                        Thread.Sleep(3000);//如果队列中没有消息休息3秒,千万不能少
                    }
                }
            },fileLogPath);

        } 
这样就大功告成了, 另附生成后的日志代码截图一张。
下面我们故意抛一个异常

   public ActionResult Show()
        {
            int b = 0;
            int c = 9 / b;
            return Content(c.ToString());
        }
文件配置在了App_Data文件夹中
日志代码截图如下 

技术分享

Log4Net与MVC结合的日志处理技术