使用log4net可以很方便地为应用添加日志功能。应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能。同时,通过外部配置文件,用户可以不用重新编译程序就能改变应用的日志行为,使得用户可以根据情况灵活地选择要记录的信息。
一、安装log4net.dll
二、建错误日志表
我用的MySql数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Date: 2018-04-01 14:01:45 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `errorlog` -- ---------------------------- DROP TABLE IF EXISTS `errorlog`; CREATE TABLE `errorlog` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `DATE` datetime DEFAULT NULL, `Thread` varchar(255) DEFAULT NULL, `LEVEL` varchar(50) DEFAULT NULL, `Logger` varchar(255) DEFAULT NULL, `Message` varchar(4000) DEFAULT NULL, `Exception` varchar(8000) DEFAULT NULL, `System` varchar(200) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=366 DEFAULT CHARSET=utf8;
三、添加配置文件
新建log4net.config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 <?xml version="1.0" encoding="utf-8" ?> <log4net debug="false"> <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> <!--https://www.cnblogs.com/shenbing/p/6210438.html--> <bufferSize value="1" /> <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" /> <connectionString value="server=120.****.53;user id=root;password=*****;persistsecurityinfo=True;database=***" providerName="MySql.Data.MySqlClient" /> <commandText value="INSERT INTO errorlog (`Date`,`Thread`,`Level`,`Logger`,`Message`,`Exception`,`System`) VALUES(@log_date, @thread, @log_level, @logger, @message, @exception, @system)" /> <parameter> <parameterName value="@log_date" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@log_level" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value="@exception" /> <dbType value="String" /> <size value="8000" /> <layout type="log4net.Layout.ExceptionLayout" /> </parameter> <parameter> <parameterName value="@system" /> <dbType value="String" /> <size value="200" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{system}" /> </layout> </parameter> </appender> <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <param name="File" value="Log/AT.log"/> <param name="datePattern" value="YY-MM-dd HH:mm"/> <param name="AppendToFile" value="true"/> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/> </layout> </appender> <appender name="HttpTraceAppender" type="log4net.Appender.ASPNetTraceAppender"> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/> </layout> </appender> <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/> </layout> </appender> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="Log4net\BP"/> <appendToFile value="true"/> <rollingStyle value="Date"/> <datePattern value="_yyyyMMdd'.log'"/> <staticLogFileName value="false"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%d [%t] %-5p %c - %m%n"/> </layout> </appender> <!--设置根目录,添加appenders并设置默认日志等级 --> <root> <level value="WARN"/> <level value="INFO"/> <level value="DEBUG"/> <level value="FINE"/> <appender-ref ref="ADONetAppender" /> <appender-ref ref="RollingLogFileAppender"/> </root> <!-- 为特定的目录指定等级 --> <logger name="iNotes"> <level value="WARN"/> <level value="INFO"/> <level value="DEBUG"/> <level value="FINE"/> <appender-ref ref="ADONetAppender"/> <appender-ref ref="RollingLogFileAppender"/> </logger> <logger name="StellaLogger"> <level value="ALL"/> <appender-ref ref="AdoNetAppender" /> <appender-ref ref="RollingLogFileAppender"/> </logger> </log4net>
四、Global.asax配置
1、在Global.asax全局配置里面添加 GlobalConfiguration.Configuration.Filters.Add(new WebApiExceptionFilterAttribute()); 这一句,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 using log4net.Config; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; using WebAPI.App_Start; namespace WebAPI { public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //全局异常处理 GlobalConfiguration.Configuration.Filters.Add(new WebApiExceptionFilterAttribute()); //配置log4 log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("~/log4net.config"))); } } }
2、在WebApiConfig.cs文件的Register方法里面添加 config.Filters.Add(new WebApiExceptionFilterAttribute()); 这一句,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public static void Register(HttpConfiguration config) { //跨域配置 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); // Web API 路由 config.MapHttpAttributeRoutes(); RouteTable.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ).RouteHandler = new SessionControllerRouteHandler(); config.Filters.Add(new WebApiExceptionFilterAttribute()); }
五、WebApiExceptionFilterAttribute类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 using log4net; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web; using System.Web.Http.Filters; namespace WebAPI.App_Start { public class WebApiExceptionFilterAttribute : ExceptionFilterAttribute { //重写基类的异常处理方法 public override void OnException(HttpActionExecutedContext actionExecutedContext) { //1.log4net记录异常日志 var logger = LogManager.GetLogger(typeof(WebApiExceptionFilterAttribute)); logger.Error("ErrorMessage", actionExecutedContext.Exception); //2.返回调用方具体的异常信息 if (actionExecutedContext.Exception is NotImplementedException) { actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented); } else if (actionExecutedContext.Exception is TimeoutException) { actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.RequestTimeout); } //.....这里可以根据项目需要返回到客户端特定的状态码。如果找不到相应的异常,统一返回服务端错误500 else { actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError); var oResponse = new HttpResponseMessage(HttpStatusCode.NotImplemented); oResponse.Content = new StringContent("方法不被支持"); oResponse.ReasonPhrase = "This Func is Not Supported"; actionExecutedContext.Response = oResponse; } base.OnException(actionExecutedContext); } } }
详细请参考:
https://www.cnblogs.com/shenbing/p/6210438.html
https://www.cnblogs.com/landeanfen/p/5363846.html