• .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

    一分辛苦一分才
  • 相关阅读:
    sina sae搭建wordpress数据库配置
    Daper返回DataTable
    第4章 jQuery中的事件和动画
    第3章 ,jQuery中的DOM操作
    第2章 jQuery选择器
    第1章 认识jQuery
    MyBatis基本查询、条件查询、查询排序
    《Head First Servlets & JSP》-13-过滤器和包装器
    《Head First Servlets & JSP》-12-Web应用安全
    《Head First Servlets & JSP》-11-Web应用部署
  • 原文地址:https://www.cnblogs.com/JoanLin-workNotes/p/12529211.html
Copyright © 2020-2023  润新知