程序中原来只记录一个日志,现在我要写一个用户操作日志,需要与原来的日志分开,在config文件中一阵折腾无果(要么写不全,要么写重了,反正没办法完美分离,要么与现存代码没办法完美兼容),差点放弃准备自己直接写txt文件了。

在网上看到可以写自定义filter,可以and可以or,那还有什么事情是搞不定的呢? 代码比较简单,不解释。

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; }
}
} 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; }
}
}
    <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=""/>
<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=""/>
<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=""/>
<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>
public partial class Test : System.Web.UI.Page
{
static ILog log = log4net.LogManager.GetLogger(typeof(Test));
static ILog logForSubmitStudentCode = log4net.LogManager.GetLogger("SubmitStudentCode");
static ILog logForUserAction = log4net.LogManager.GetLogger("UserAction"); protected void Page_Load(object sender, EventArgs e)
{
log.Fatal("Fatal");
log.Error("Error");
log.Warn("Warn");
log.Info("info");
logForSubmitStudentCode.Logger.Log(typeof(Test), new log4net.Core.Level(, "SubmitStudentCode"), "SubmitStudentCode test", null);
logForUserAction.Logger.Log(typeof(Test), new log4net.Core.Level(, "UserAction"), "UserAction test", null);
}
}

log4net 自定义日志级别记录多个日志的更多相关文章

  1. SpringBoot日志配置(详解) 涉及控制台输出日志、生成日志文件、日志级别修改、hibernate日志不输出

    写在前面 本篇主要讲述日志配置,看完本篇可以解决下述问题, 控制台输出日志.生成日志文件.日志级别修改.hibernate日志不输出 Git Demo Path:https://github.com/ ...

  2. 如何利用log4Net自定义属性配置功能记录完整的日志信息

    log4Net作为专业的log记录控件,对于它的强大功能大家一定不陌生.下面我将详细介绍如何利用其自定义属性,让日志信息更完整. 一,创建测试工程,log4Net组件可以自己从网上下载,也可通过Nug ...

  3. Log4net按照不同级别写入多个日志文件

    [assembly: log4net.Config.XmlConfigurator(Watch = true)]//注入 在一个Web应用项目中,我使用了Fluent NHibernate作为数据访问 ...

  4. Spring aop+自定义注解统一记录用户行为日志

    写在前面 本文不涉及过多的Spring aop基本概念以及基本用法介绍,以实际场景使用为主. 场景 我们通常有这样一个需求:打印后台接口请求的具体参数,打印接口请求的最终响应结果,以及记录哪个用户在什 ...

  5. log4net 记录MVC监控日志

    由于MVC自身的特点,可以让我们记录每一个Controller下Action的执行时间以及View视图渲染完成的时间,本文采用log4net记录MVC每个Action的执行时间和View视图渲染完成时 ...

  6. 【Logback日志级别】动态调整Logback的日志级别

    一.导入 Logback作为目前一个比较流行的日志框架,我们在实际项目经常使用到该框架来帮助我们打印日志,以便我们可以更快速地获取业务逻辑执行情况.定位系统问题. 常用的日志打印一共有5种级别控制,优 ...

  7. java log4j基本配置及日志级别配置详解

    java log4j日志级别配置详解 1.1 前言 说出来真是丢脸,最近被公司派到客户公司面试外包开发岗位,本来准备了什么redis.rabbitMQ.SSM框架的相关面试题以及自己做过的一些项目回顾 ...

  8. Confluence 6 log4j 日志级别

    日志级别 DEBUG - 被设计为用来获得最多的信息和事件,在对应用程序进行调试的时候,这个日志级别通常能够提供最多的有效信息(查看应用程序怎么了) INFO - 有关系统正常运行-计划任务运行,服务 ...

  9. jenkins修改日志级别方法

    1.jenkins日志有时候也会消耗掉很大内存,在传输时也会消耗掉大量带宽,如图,300+M的日志大小,太夸张了吧 2.修改日志级别的方法: 在配置文件里修改,重启后永久生效,配置路径:/etc/sy ...

随机推荐

  1. 枚举,Math和Random

    1.实用类: 01.枚举 enum Student stu=new Student(); 我们为了保证用户一个健康的输入! 我们使用了封装特性! 用户就不能直接访问我们的属性了!! private c ...

  2. 一些做vue前端的经验

    1.先赋值,后渲染 场景:表格渲染中,一般都是这样把json的东西传给table的 this.tableData = json.data.rows 然后的话我们一般会在渲染前对json中的数据做一些转 ...

  3. HTML(四)Form标签

    <form>…</form>    定义供用户输入的 HTML 表单 例子 <html> <body> <form method="ge ...

  4. SpringMVC中文乱码的解决办法

    中文乱码分类: (1)按照请求分类: GET请求乱码 POST请求乱码 (2)按照乱码位置分类 从前台传到后台的数据乱码(存储到数据库中的数据乱码) 从后台传到前台的数据乱码(显示在页面的数据乱码) ...

  5. .net core 之Hangfire任务调度

    Hangfire可用作任务调度,类似延迟任务.队列任务.批量任务和定时任务等. 一.nuget Hangfire包 找到Hangfire.AspNetCore和Hangfire.SqlServer包, ...

  6. C++标准异常概述

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  7. selenium登录界面,创建表单并填写提交

    #! python3 # -*- coding:utf8 -*- # https://selenium-python.readthedocs.io/api.html#selenium.webdrive ...

  8. hdu 1754解题报告 (代码+注释)

      I Hate It Time Limit: 3000MS     Memory Limit: 32768 K Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问, ...

  9. VSTO:使用C#开发Excel、Word【10】

    第二部分:.NET中的Office编程本书前两章介绍了Office对象模型和Office PIA. 您还看到如何使用Visual Studio使用VSTO的功能构建文档中的控制台应用程序,加载项和代码 ...

  10. Spring Data JPA中的动态查询 时间日期

    功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...