c# 自定义log4net过滤器

有时候为了实现自己想要的多个日志文件记录不同的内容,可能需要自定义log4net过滤器,比如我这里需要记录三个文件,这三个文件的内容又不能重复,多次尝试未果。

为了不更改任何现有日志代码的情况下,于是自定了过滤器。

<log4net>
        <root name="Default">
      <level value="All" />
            <appender-ref ref="FileAppender"/>
        </root>
    <logger name="SubmitStudentCode">
      <level value="SubmitStudentCode" />
      <appender-ref ref="FileAppender.SubmitStudentCode" />
    </logger>
    <logger name="UserAction">
      <level value="UserAction" />
      <appender-ref ref="FileAppender.UserAction" />
    </logger>
    <appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
            <param name="File" value="Log/"/>
            <param name="AppendToFile" value="true"/>
            <param name="MaxSizeRollBackups" value="10"/>
            <param name="StaticLogFileName" value="false"/>
            <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;"/>
            <param name="RollingStyle" value="Date"/>
            <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%n"/>
            </layout>
      <filter type="FirsteElite.Model.Model.Log.OrFilter">
        <filter type="log4net.Filter.LevelMatchFilter">
          <levelToMatch value="INFO" />
        </filter>
        <filter type="log4net.Filter.LevelRangeFilter">
          <levelMin value="WARN" />
          <levelMax value="FATAL" />
        </filter>
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
        </appender>
    <appender name="FileAppender.SubmitStudentCode" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log/" />
      <param name="AppendToFile" value="true"/>
      <param name="MaxSizeRollBackups" value="10"/>
      <param name="StaticLogFileName" value="false"/>
      <param name="DatePattern" value="yyyy-MM-dd&quot;_SubmitStudentCode.log&quot;"/>
      <param name="RollingStyle" value="Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d	%m%n"/>
      </layout>
      <filter type="log4net.Filter.LoggerMatchFilter">
        <param name="LoggerToMatch" value="SubmitStudentCode" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>
    <appender name="FileAppender.UserAction" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log/"/>
      <param name="AppendToFile" value="true"/>
      <param name="MaxSizeRollBackups" value="10"/>
      <param name="StaticLogFileName" value="false"/>
      <param name="DatePattern" value="yyyy-MM-dd&quot;_UserAction.log&quot;"/>
      <param name="RollingStyle" value="Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d	%m%n"/>
      </layout>
      <filter type="log4net.Filter.LoggerMatchFilter">
        <param name="LoggerToMatch" value="UserAction" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>

  </log4net>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net.Filter;
using log4net.Core;

namespace FirsteElite.Model.Model.Log
{
    public class AndFilter : FilterSkeleton
    {
        private bool acceptOnMatch;
        private readonly IList<IFilter> filters = new List<IFilter>();

        public override FilterDecision Decide(LoggingEvent loggingEvent)
        {
            if (loggingEvent == null)
                throw new ArgumentNullException("loggingEvent");

            foreach (IFilter filter in filters)
            {
                if (filter.Decide(loggingEvent) != FilterDecision.Accept)
                    return FilterDecision.Neutral; // one of the filter has failed
            }

            return FilterDecision.Accept;
        }

        public IFilter Filter
        {
            set { filters.Add(value); }
        }

        public bool AcceptOnMatch
        {
            get { return acceptOnMatch; }
            set { acceptOnMatch = value; }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net.Filter;
using log4net.Core;

namespace FirsteElite.Model.Model.Log
{
    public class OrFilter : FilterSkeleton
    {
        private bool acceptOnMatch;
        private readonly IList<IFilter> filters = new List<IFilter>();

        public override FilterDecision Decide(LoggingEvent loggingEvent)
        {
            if (loggingEvent == null)
                throw new ArgumentNullException("loggingEvent");

            foreach (IFilter filter in filters)
            {
                if (filter.Decide(loggingEvent) == FilterDecision.Accept)
                    return FilterDecision.Accept;
            }

            return FilterDecision.Deny;
        }

        public IFilter Filter
        {
            set { filters.Add(value); }
        }

        public bool AcceptOnMatch
        {
            get { return acceptOnMatch; }
            set { acceptOnMatch = value; }
        }
    }
}
public static class UserActionLogger
        {
            static ILog userActionLogger = log4net.LogManager.GetLogger("UserAction");

            public static void log(string msg)
            {
                userActionLogger.Logger.Log(null, new log4net.Core.Level(50001, "UserAction"), msg, null);
            }
        }
时间: 2024-10-17 21:22:06

c# 自定义log4net过滤器的相关文章

自定义jinja2 过滤器

今天,我们要讲的是自定义jinja2 过滤器这个知识点,因为官方文档对此一代而过,讲得不够清楚,所以我们专门拿出来讲一下. 例子 例子写了两个自定义过滤器,一个是转换字典到字符串的过滤器,一个是返回当前参数的类型的过滤器. 源代码: https://github.com/lewis617/jinja2-filter filter是个函数 filter是个函数,跟angular的过滤器几乎一模一样.参数就是管道(pipe)前面那个变量.比如   123|myfilter,123就是myFilter

java学习笔记(2):获取文件名和自定义文件过滤器

//自定义文件过滤器import java.io.File; import javax.swing.filechooser.*; public class JavaChooser extends FileFilter{ @Override public String getDescription() { return ".java"; } @Override public boolean accept(File f) { // TODO Auto-generated method st

实现MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器

MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过App_Start中的FilterConfig来实现的过滤器注册是全局的,也就是整个应用程序都会使用的,针对单独的Filter我们不得不去单独的Controller或者Action去定义 如图: 那么问题来了,我现在想在FitlerConfig里面去维护所有的过滤器,但是又想实现自定义的过滤器该咋搞,MVC默认不支持! 我们先来看看,MVC默认的Fitlers注册是怎样的官方源码:GlobalFilterColle

django 第五课自定义模板过滤器与标签

代码布局:(自定义的代码放在哪里) 某个app特有的 app目录下,templatetags文件夹需要放 __init__.py 在到templetags文件夹下创建python模块(py文件) 定义复用 创建要给新的app,将他们定义在新的app中,在INSTALL_APPS 注册,然后可以应用 自定义模板过滤器 模板过滤器是什么? 函数,一个或两个参数 第一个参数是传递进来的模板变量 第二个参数,普通的参数,也可以是默认也可以不要其实就是个函数,没有什么不同在app目录teacher下创建t

MVC过滤器:自定义授权过滤器

一.授权过滤器 授权过滤器用于实现IAuthorizationFilter接口和做出关于是否执行操作方法(如执行身份验证或验证请求的属性)的安全策略.AuthorizeAttribute类继承了IAuthorizationFilter接口,是授权过滤器的示例.授权过滤器在任何其他过滤器之前运行. 如果要自定义授权过滤器,只需要定义一个类继承自AuthorizeAttribute类,然后重写AuthorizeAttribute类里面的方法即可. 二.示例 下面根据一个具体的案例来讲解如何使用自定义

MVC过滤器:自定义操作过滤器

一.操作过滤器 1.定义 操作过滤器用于实现IActionFilter接口以及包装操作方法执行.IActionFilter接口声明两个方法:OnActionExecuting和OnActionExecuted.OnActionExecuting在操作方法之前运行.OnActionExecuted在操作方法之后运行,可以执行其他处理,如向操作方法提供额外数据.检查返回值或取消执行操作方法. 查看ActionFilterAttribute类的定义: #region 程序集 System.Web.Mv

Django之自定义标签,过滤器,以及inclusion_tag

目录 Django之自定义标签,过滤器,以及inclusion_tag 自定义过滤器 自定义标签 inclusion_tag inclusion_tag() 项目实例: inclusion_tag() 案例(博客左侧标签栏) Django之自定义标签,过滤器,以及inclusion_tag 自定义过滤器 1,确定app是否在setting中注册 2 在app下创建一个templatetags的文件夹(模块)(名字不能变***) 3 在模块下创建一个py文件,名字随意:mytag.py 4 第一步

ASP.NET Core中使用自定义MVC过滤器属性的依赖注入

原文:ASP.NET Core中使用自定义MVC过滤器属性的依赖注入 除了将自己的中间件添加到ASP.NET MVC Core应用程序管道之外,您还可以使用自定义MVC过滤器属性来控制响应,并有选择地将它们应用于整个控制器或控制器操作. ASP.NET Core中常用的MVC过滤器之一是  ExceptionFilterAttribute,用于处理Wep API应用程序中的错误响应.它很容易实现,开发人员和我在ASP.NET Core中使用MVC过滤器属性所面临的问题是访问Startup.cs类

ng自定义一个过滤器

ng允许我们自定义指令 下面来我们自己来定义一个过滤指令:filter,返回一个函数的形式 filter(name,callback(){//name:过滤器的名字,callback:匿名函数 return function(collection,keynames){//collection:该指令前面的对象,keynames:用于过滤的关键字 /........................./ } }) 金典的例子: demo: <!doctype html><html lang=