.net Log4Net日志的配置及使用 全局异常过滤器

.net添加Log4Net日志的配置及使用,以及将其设置为全局异常过滤器,主要有以下步骤:

1. 新建一个Web应用程序
2. 引用log4net.dll
3. 添加config文件
4. 在AssemblyInfo.cs进行注册
5. 在Global.asax中进行初始化设置
6. 添加Log4Helper.cs帮助类
7. 新增过滤器LogExceptionFilter.cs文件
8. 在FilterConfig.cs中添加过滤器
9. 在Global.asax中注册过滤器

详细步骤如下:

1.新建一个web应用程序,如下图所示

2.利用Nuget引用log4net.dll

3.为了便于管理,添加log4net.config文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" />
  </system.web>

  <log4net>

    <appender name="WarnAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Logs\\Warn"/>
      <appendToFile value="true"/>
      <rollingStyle value="Date"/>
      <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>
      <staticLogFileName value="false"/>
      <param name="MaxSizeRollBackups" value="100"/>
      <maximumFileSize value="1GB" />
      <layout type="log4net.Layout.PatternLayout">       
      <conversionPattern value="%n==========
                                  %n【日志级别】%-5level
                                  %n【记录时间】%date
                                  %n【线程编号】[%thread]
                                  %n【执行时间】[%r]毫秒
                                  %n【出错文件】%F
                                  %n【出错行号】%L
                                  %n【出错的类】%logger 属性[%property{NDC}]
                                  %n【错误描述】%message
                                  %n【错误详情】%newline"/>
      </layout>
    </appender>

    <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Logs\\LogInfo"/>
      <appendToFile value="true"/>
      <rollingStyle value="Date"/>
      <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>
      <staticLogFileName value="false"/>
      <param name="MaxSizeRollBackups" value="100"/>
      <maximumFileSize value="1GB" />
      <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%n==========
                                  %n【日志级别】%-5level
                                  %n【记录时间】%date
                                  %n【线程编号】[%thread]
                                  %n【执行时间】[%r]毫秒
                                  %n【出错文件】%F
                                  %n【出错行号】%L
                                  %n【出错的类】%logger 属性[%property{NDC}]
                                  %n【错误描述】%message
                                  %n【错误详情】%newline"/>
      </layout>
    </appender>

  
    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Logs\\LogError"/>     
      <appendToFile value="true"/>
      <rollingStyle value="Date"/>
      <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>
      <staticLogFileName value="false"/>
      <param name="MaxSizeRollBackups" value="100"/>
      <maximumFileSize value="1GB" />
      <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%n==========
                                  %n【日志级别】%-5level
                                  %n【记录时间】%date
                                  %n【线程编号】[%thread]
                                  %n【执行时间】[%r]毫秒
                                  %n【出错文件】%F
                                  %n【出错行号】%L
                                  %n【出错的类】%logger 属性[%property{NDC}]
                                  %n【错误描述】%message
                                  %n【错误详情】%newline"/>
      </layout>
    </appender>
    <logger name="logerror">
      <level value="ERROR" />
      <appender-ref ref="ErrorAppender" />
    </logger>

    <logger name="warning">
      <level value="WARN" />
      <appender-ref ref="WarnAppender" />
      <!--<appender-ref ref="ConsoleAppender" />-->
    </logger>

    <logger name="info">
      <level value="ALL"/>
      <appender-ref ref="InfoAppender" />
    </logger>
  </log4net>
</configuration>
View Code

config文件中节点说明如下:

<!--错误日志:记录错误日志-->
    <!--按日期分割日志文件 一天一个-->
    <!-- appender 定义日志输出方式   将日志以回滚文件的形式写到文件中。-->
    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
      <!--保存路径:下面路径项目启动的时候会在相应目录创建logs、logError文件夹-->
      <file value="Logs\\LogError"/>

      <!-- 如果想在本项目中添加路径,那就直接去掉C:\\  只设置log\\LogError  项目启动中默认创建文件夹 -->
      <appendToFile value="true"/>

      <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
      <rollingStyle value="Date"/>

      <!--这是按日期产生文件夹-->
      <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>

      <!--是否只写到一个文件中-->
      <staticLogFileName value="false"/>

      <!--保留的log文件数量 超过此数量后 自动删除之前的   好像只有在 按Size分割时有效 设定值value="-1"为不限文件数-->
      <param name="MaxSizeRollBackups" value="100"/>

      <!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
      <maximumFileSize value="1GB" />

      <!-- layout 控制Appender的输出格式,也可以是xml  一个Appender只能是一个layout-->
      <layout type="log4net.Layout.PatternLayout">

        <!--每条日志末尾的文字说明-->
        <!--输出格式 模板-->
        <!--<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n"/>-->
        <conversionPattern value="%n==========
                                  %n【日志级别】%-5level
                                  %n【记录时间】%date
                                  %n【线程编号】[%thread]
                                  %n【执行时间】[%r]毫秒
                                  %n【出错文件】%F
                                  %n【出错行号】%L
                                  %n【出错的类】%logger 属性[%property{NDC}]
                                  %n【错误描述】%message
                                  %n【错误详情】%newline"/>
      </layout>
    </appender>


<appender/>节点的name属性的值对应<logger/>节点中的name属性的值
View Code

4.在AssemblyInfo.cs文件中对log4net.config文件进行注册,添加代码如下

// 为项目注册Log4Net.config配置文件
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

 

5.在Global.asax中对其进行初始化设置

//读取日志 如果使用log4net,应用一开始的时候,都要进行初始化设置
log4net.Config.XmlConfigurator.Configure();

 

6.如果不需要添加全局异常过滤器的话,则执行到这一步即可,添加Log4Helper.cs文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using log4net;

namespace LogDemo
{
    public class Log4netHelper
    {
        public static readonly ILog logInfo = log4net.LogManager.GetLogger("info");
        public static readonly ILog logWarn = log4net.LogManager.GetLogger("warning");
        public static readonly ILog logError = log4net.LogManager.GetLogger("logerror");

        public static void Info(string info)
        {
            if (logInfo.IsInfoEnabled)
            {
                logInfo.Info(info);
            }
        }

        public static void Warn(string info, Exception ex)
        {
            if (logWarn.IsWarnEnabled)
            {
                logWarn.Warn(info, ex);
            }
        }

        public static void Debug(string info, Exception ex)
        {
            if (logError.IsDebugEnabled)
            {
                logError.Debug(info, ex);
            }
        }

        public static void ErrorLog(object msg)
        {
            //Task.Run(() => logError.Error(msg)); // 异步
            logError.Error(msg);
        }

        public static void ErrorLog(Exception ex)
        {
            //Task.Run(() => logError.Error(Newtonsoft.Json.JsonConvert.SerializeObject(ex)));
            logError.Error(Newtonsoft.Json.JsonConvert.SerializeObject(ex));
        }

        public static void ErrorLog(object msg, Exception ex)
        {
            if (ex != null)
            {
                //Task.Run(() => logError.Error(msg, ex)); // 异步
                logError.Error(msg, ex);
            }
            else
            {
                //Task.Run(() => logError.Error(msg)); // 异步
                logError.Error(msg);
            }
        }
    }
}
View Code

7.新增Filters文件夹,添加LogExceptionFilter.cs文件,如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace LogDemo.Filters
{
    /// <summary>
    /// 异常过滤器
    /// </summary>
    public class LogExceptionFilter : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            if (!filterContext.ExceptionHandled)
            {
                string controllerName = (string)filterContext.RouteData.Values["controller"];
                string actionName = (string)filterContext.RouteData.Values["action"];
                string msgTemplate = "在执行 controller[{0}] 的 action[{1}] 时产生异常:[{2}]";

                log4net.ILog log = log4net.LogManager.GetLogger("LogError");//获取一个日志记录器
                log.Error(DateTime.Now.ToString() + ": login success");//写入一条新log

                Log4netHelper.ErrorLog(string.Format(msgTemplate, controllerName, actionName, filterContext.Exception.Message), filterContext.Exception);

                filterContext.HttpContext.Response.Redirect("/Error/Index");
                return;
            }
            else
            {
                base.OnException(filterContext);
            }
        }
    }
}
LogExceptionFilter

 

8.在App_Start文件中添加FilterConfig.cs文件

using LogDemo.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace LogDemo.App_Start
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {            
            // 注册异常处理过滤器
            filters.Add(new LogExceptionFilter());

            filters.Add(new CustomerFilterAttribute());
        }
    }
}

9.在Global.asax文件中进行注册

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

如果本文对你有所帮助,请留下痕迹。

本文参考地址:

https://www.cnblogs.com/shiruina/p/9284446.html

https://www.cnblogs.com/Hmd528/p/11082814.html

posted @ 2020-03-20 04:04  不是少年也游荡  阅读(448)  评论(0编辑  收藏  举报