zoukankan      html  css  js  c++  java
  • Log4Net 之初体验

    今天试了一下关于日志的一个插件——Log4Net

    关于这个插件就不过多描述了,有很多人用,也挺好用比较方便,所以在此记录下使用过程。

    一、建一个mvc 空网站 名字叫 Log4NetTest

    二、下载log4net.dll 并添加引用,也可以用NuGet在线安装

    三、在Models  文件夹下建立MyErrorAttribute 大概就是把所有的错误丢进队列里面去,并且继承 HandleErrorAttribute 代码就如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace Log4NetTest.Models
    {
        public class MyErrorAttribute : HandleErrorAttribute
        {
            public static Queue<Exception> ExceptionQueue = new Queue<Exception>();
            public override void OnException(ExceptionContext filterContext)
            {
                ExceptionQueue.Enqueue(filterContext.Exception);
    
                //跳转到友好页面
                //filterContext.HttpContext.Response.Redirect("~/Error.html");
                base.OnException(filterContext);
    
            }
        }
    }

    四、在过滤配置代码里添加自定义的过滤FilterConfig里加 filters.Add(new MyErrorAttribute());

    五、打开Global.asax文件 在里面开一个进程,每隔5秒,查看队列里面是否有错误信息,如果有的话就用log4net记记录

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading;
    using System.Web;
    using System.Web.Http;
    using System.Web.Mvc;
    using System.Web.Routing;
    using Log4NetTest.Models;
    
    namespace Log4NetTest
    {
        // 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
        // 请访问 http://go.microsoft.com/?LinkId=9394801
        public class MvcApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                log4net.Config.XmlConfigurator.Configure();//读取了webConfig中的信息
    
                AreaRegistration.RegisterAllAreas();
    
                WebApiConfig.Register(GlobalConfiguration.Configuration);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
    
                ThreadPool.QueueUserWorkItem(o =>
                {
                    while (true)
                    {
                        if (MyErrorAttribute.ExceptionQueue.Count > 0)
                        {
                            Exception ex = MyErrorAttribute.ExceptionQueue.Dequeue();
                            if (ex != null)
                            {
                                log4net.ILog logger = log4net.LogManager.GetLogger("testError");
                                logger.Error(ex.ToString());//将错误写入log4net
                            }
                            else
                            {
                                Thread.Sleep(5000);
                            }
                        }
                        else
                        {
                            Thread.Sleep(5000);
                        }
                    }
                });
            }
        }
    }

    六、到了最重要的一步,就是配置文件,在配置文件里你可以定义日志文件存放在哪,什么格式,记录什么样的错误等等,配置如下:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
      有关如何配置 ASP.NET 应用程序的详细信息,请访问
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
      </configSections>
      <!--************** log4net 配置开始-->
      <log4net>
        <root>
          <level value="ALL"/>
          <appender-ref ref="SysAppender"/>
        </root>
        <logger name="WebLogger">
          <!--这里开始进一步限制日志级别,只有在大于等于DEBUG情况下才会记录日志-->
          <level value="DEBUG"/>
        </logger>
        <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
          <!--指定日志存放的路径,直接存进App_Data-->
          <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="Headel" 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>
      <!--************** log4net 配置结束-->
      <appSettings>
        <add key="webpages:Version" value="2.0.0.0" />
        <add key="webpages:Enabled" value="false" />
        <add key="PreserveLoginUrl" value="true" />
        <add key="ClientValidationEnabled" value="true" />
        <add key="UnobtrusiveJavaScriptEnabled" value="true" />
      </appSettings>
    
      <system.web>
        
        <httpRuntime targetFramework="4.5" />
        
        <compilation debug="true" targetFramework="4.5" />
    
        <pages>
          <namespaces>
            <add namespace="System.Web.Helpers" />
            <add namespace="System.Web.Mvc" />
            <add namespace="System.Web.Mvc.Ajax" />
            <add namespace="System.Web.Mvc.Html" />
            <add namespace="System.Web.Routing" />
            <add namespace="System.Web.WebPages" />
          </namespaces>
        </pages>
      </system.web>
    
      <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
         
      <handlers>
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%Microsoft.NETFrameworkv4.0.30319aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%Microsoft.NETFramework64v4.0.30319aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers></system.webServer>
    </configuration>
    View Code

    七、下面我们进行测试,新建控制器定义两个int 然后除以0,运行,会出现报错页面,然后去App_Data文件夹下,你会神奇的发现,系统自己建立了一个文件里面记录了详细的错误信息。

     Appender:可以将日志输出到不同的地方,不同的输出目录对应不同的Appender,如RollingFileAppender(滚动文件)、AdoNetAppender(数据库)、SmtpAppender(邮件)等。

    level(级别):标识这条日志信息的重要级别 None>Fatal>ERROR>WARN>DEBUG>INFO>ALL ,设定一个Level,低于这个Level的级别将不会写到日志里。

    Log4Net 可以设定多个Appender 可以同时将日志记录在文件、数据库、发送邮件。

    OK 以上就是log4net的简单实用方法,配置文件还有很多自定义可以去研究,这里就不多说了,与Log4Net类似的框架也有很多如Apache的CommonLog还有NLog。

  • 相关阅读:
    Gem命令详解
    使用Ruby脚本部署Redis Cluster集群
    解决gem install redis报错
    Redis Cluster命令安装
    Redis Sentinel原理介绍与部署
    PyCharm单行多行代码注释快捷键
    windows下python安装与卸载
    MySQL通过SQL语句查看表的索引
    Redis主从复制
    MySQL开启binlog日志
  • 原文地址:https://www.cnblogs.com/gress/p/6953870.html
Copyright © 2011-2022 走看看