使用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 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()); 这一句,如下:
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()); 这一句,如下:
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类
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);
}
}
}