使用log4net可以很方便地为应用添加日志功能。应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能。同时,通过外部配置文件,用户可以不用重新编译程序就能改变应用的日志行为,使得用户可以根据情况灵活地选择要记录的信息。
一、安装log4net.dll
二、建错误日志表
我用的MySql数据库
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
<?xml version="1.0" encoding="utf-8" ?> <log4net debug="false"> <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> <!--BufferSize为缓冲区大小,表示是记录10 条到缓冲区,满10条后再写入SQL server--> <bufferSize value="1" /> <!--在数据库连接异常时是否重新连接--> <param name="ReconnectOnError" value="true" /> <!--记录到数据库--> <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" /> <connectionString value="server=10.25.135.99;Port=3306;User Id=root;password=Password@123;Persist Security Info=True;database=taskmgt" 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"> <!--定义的是日志记录到文件的附着器--> <!--定义Log文件存放位置--> <file value="log4net\THS"/> <!--为true就表示日志会附加到文件,为false,则会重新创建一个新文件--> <appendToFile value="true"/> <rollingStyle value="Date"/> <datePattern value="_yyyyMMdd'.log'"/> <!--名称是否可以更改为false为可以更改--> <staticLogFileName value="false"/> <!--设置无限备份=-1 ,最大备份数为1000--> <param name="MaxSizeRollBackups" value="100" /> <layout type="log4net.Layout.PatternLayout"> <!--layout负责把记入的内容格式化--> <!--每条日志末尾的文字说明--> <!--输出格式--> <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info--> <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %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配置
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"))); } } }
五、WebApiExceptionFilterAttribute类
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