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=""Logs_"yyyyMMdd".txt""/> <!--日志名称是否静态:否--> <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.NET\Framework\v4.0.30319\aspnet_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.NET\Framework64\v4.0.30319\aspnet_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>
七、下面我们进行测试,新建控制器定义两个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。