log4net记录错误日志并保存至数据库

使用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 

猜你喜欢

转载自blog.csdn.net/qq_32688731/article/details/79777693
今日推荐