log4Net的配置 与 自定义一个异常过滤器来实现使用log4Net 以及四种过滤器Filter的介绍

什么是AOP?
:AOP(面向切面编程)是一种架构思想,用于把公共的逻辑放到一个单独的地方,这样就不用每个地方都写重复的代码了。比如程序中发生异常,不用每个地方都try....catch... 只要在(Global的Application_Error)中统一进行异常处理,不用每个Action中都检查当前用户是否有执行权限,Asp.net Mvc中提供了一个机制,每个Action执行之前都会执行我们的代码,这样统一检查,一夫当关,万夫莫开!
四种Filter:ASP.ENT MVC 中提供了四个Filter(过滤器) 接口实现了这种AOP机制:
IAuthorizationFilter,IActionFilter,IResultFilter,IExceptionFilter。
1)IAuthorizationFilter一般用来检查当前用户是否有Action的执行权限,在每个Action执行前执行OnAuthorization方法:
2)IActionFilter也是在每个Action被执行前执行OnActionExecuting方法,每个Action执行完成后执行OnActionExecuted方法。和IAuthorizationFilter的区别是IAuthorizationFilter在IActionFilter之前执行,检查权限一般写到IAuthorizationFilter中;
3)IResultFilter,在每个ActionResult的前后执行IResultFilter。用的很少,后面有一个应用。
4)IExceptionFilter,当Action执行发生未处理异常的时候执行OnException方法

定义的类可以在Global中GlobalFilters.Add(new XXXFilter());的方式添加为全局

1:安装程序集 Install-Package Log4NET
2:在Web.config 中添加节点
<configuration>
    配置节点
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
  </configuration>



配置节点
<log4net>
    <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
    <!-- Set root logger level to ERROR and its appenders -->
    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingFileTracer" />
    </root>
    <!-- Print only messages of level DEBUG or above in the packages -->
    <appender name="RollingFileTracer" type="log4net.Appender.RollingFileAppender,log4net">
      <param name="File" value="App_Data/Log/" />
      <param name="AppendToFile" value="true" />
      <param name="RollingStyle" value="Composite" />
      <param name="MaxSizeRollBackups" value="10" />
      <param name="MaximumFileSize" value="1MB" />
      <param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />
      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>
  </log4net>

3:在Global 文件中启动
protected void Application_Start()
        {
            log4net.Config.XmlConfigurator.Configure(); //启动log4net
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

//创建一个异常过滤器,通过log4Net,记录
1:在App_Start文件夹中新建一个类继承IExceptionFilter接口,实现接口中的OnException方法 如下

namespace ZFXT.App_Start
{
    public class ZSZExceptionFilter:IExceptionFilter
    {
        private static ILog log = LogManager.GetLogger(typeof(ZSZExceptionFilter)); //声明Log4NET对象,建议一个类就声明一个ILog对象

        public void OnException(ExceptionContext filterContext)
        {
            log.ErrorFormat("出现未处理的异常{0}",filterContext.Exception);
        }
    }
}

最后把自定义的类添加到Global文件中

 public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            log4net.Config.XmlConfigurator.Configure(); //启动
            GlobalFilters.Filters.Add(new App_Start.ZSZExceptionFilter());//增加自定义异常处理器
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、概述 log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。本文主要是介绍如何在Visual Studio2008中使用log4net快速创建系统日志,如何扩展以输出自定义字段。 2、一个简单的使用实例 第一步:在项目中添加对log4net.dll的引用,这里引用版本是1.2.10.0。 第二步:程序启动时读取log4net配置文件。 如果是CS程序,在根目录的Program.cs中的Main方法中添加: log4net.Config.XmlConfigurator.Configure(); 如果是BS程序,在根目录的Global.asax.cs(没有新建一个)中的Application_Start方法中添加: log4net.Config.XmlConfigurator.Configure(); 无论BS还是CS程序都可直接在项目的AssemblyInfo.cs文件里添加以下的语句: [assembly: log4net.Config .XmlConfigurator()] 也可以使用自定义配置文件,具体请参见4.4 关联配置文件。 第三步:修改配置文件。如果是CS程序,则在默认的App.config文件(没有新建一个)中添加内容;如果是BS程序,则添加到Web.config文件中,添加内容一样,这里不再列出。 App.config文件添加内容如下: <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <root> <level value="WARN" /> <appender-ref ref="LogFileAppender" /> <appender-ref ref="ConsoleAppender" /> </root> <logger name="testApp.Logging"> <level value="DEBUG"/> </logger> <appender name="LogFileAppender" type="log4net.Appender.FileAppender" > <param name="File" value="log-file.txt" /> <param name="AppendToFile" value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="Header" value="[Header] "/> <param name="Footer" value="[Footer] "/> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="WARN" /> </filter> </appender> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> </appender> </log4net> </configuration> 第四步:在程序使用log4net.ILog log = log4net.LogManager.GetLogger("testApp.Logging");//获取一个日志记录器 log.Info(DateTime.Now.ToString() + ": login success");//写入一条新log 这样就将信息同时输出到控制台和写入到文件名为“log-file.txt”的文件中,其中“log-file.txt”文件的路径是当前程序运行所在目录;也可以定义为绝对路径,配置如: <param name="File" value="C:/log-file.txt" />就写入C盘根目录下log-file.txt文件中
好的,以下是一个基于Java的log4j2日志脱敏的过滤器示例: 首先,在log4j2配置文件中添加以下内容: ```xml <Configuration> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <filters> <Filter type="Script" language="java" script="com.example.LogFilter.filter(logEvent);"/> </filters> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` 其中,filters标签用于添加过滤器,type属性为“Script”,表示使用脚本过滤器,language属性为“java”,表示使用Java语言编写脚本。 然后,创建一个Java类,实现LogEventFilter接口,并编写脱敏逻辑。例如: ```java package com.example; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.filter.AbstractFilter; @Plugin(name = "LogFilter", category = "Core", elementType = "filter", printObject = true) public class LogFilter extends AbstractFilter { @Override public Result filter(LogEvent logEvent) { if (logEvent.getMessage().getFormattedMessage().contains("password")) { String message = logEvent.getMessage().getFormattedMessage().replaceAll("password=\\S+", "password=******"); logEvent.setMessage(logEvent.getMessage().newInstance(message)); return Result.ACCEPT; } else { return Result.NEUTRAL; } } @Override public Result filter(Logger logger, Level level, Marker marker, String s, Object... objects) { return null; } @Override public Result filter(Logger logger, Level level, Marker marker, Object o, Throwable throwable) { return null; } @Override public Result filter(Logger logger, Level level, Marker marker, Message message, Throwable throwable) { return null; } } ``` 该类实现了LogEventFilter接口,并重写了filter方法,实现了日志脱敏的逻辑。具体来说,该方法会检查日志消息中是否包含“password”关键字,如果包含,则将“password”后面的字符替换为“******”,然后返回Result.ACCEPT,表示接受该日志事件,并修改了消息内容。如果不包含,则返回Result.NEUTRAL,表示不对该日志事件进行任何修改。 最后,在log4j2配置文件中的filters标签中,使用过滤器即可。例如: ```xml <filters> <LogFilter/> </filters> ``` 这样配置后,当日志中包含“password”关键字时,日志消息中的“password”后面的字符就会被替换为“******”,从而实现了日志脱敏的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值