使用logback实现日志打印过滤

logback日志打印过滤

1.只打印sql语句以及参数

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 设置 logger context 名称,一旦设置不可改变,默认为default -->
    <!-- <contextName>myAppName</contextName> -->
    <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" />
    <!-- 日志文件大小最大值 -->
    <property name="maxFileSize" value="1kb" />
    <!-- LoggerContextListener 接口的实例能监听 logger context 上发生的事件,比如说日志级别的变化 -->
    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
    </contextListener>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder
            by default -->
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
                <expression>return message.contains("mapper") || message.contains("component") || message.contains("MapperFactoryBean");</expression>
            </evaluator>
            <OnMismatch>NEUTRAL</OnMismatch>
            <OnMatch>DENY</OnMatch>
        </filter>
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
                <expression>return message.contains("Preparing") || message.contains("Parameters:") || message.contains("Total:");</expression>
            </evaluator>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <logger name="java.sql.Statement" level="DEBUG" />
    <logger name="java.sql.PreparedStatement" level="DEBUG" />
    <logger name="com.xxx" level="debug" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>
    <root>
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

上面有两个过滤器,

其中第一个过滤器是过滤掉所有包含字符串“mapper”,“component”,“MapperFactoryBean”的日志打印

第二个过滤器是只打印包含字符串”Preparing”,”Paramters:”,”Total:”的日志内容。

logback.xml日志文件过滤器配置简析

自定义过滤器

java代码,目的是在mdc中放值,然后在日志中打印

package com.controller;
import com.pojo.JsonData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(path = "/api/log/")
public class LoggerController {
    Logger logger= LoggerFactory.getLogger(getClass());
    @RequestMapping(path = "test1")
    public Object logTest1(){
        logger.trace("-----trace级别日志-----");
        logger.debug("-----debug级别日志-----");
        logger.info("-----info级别日志-----");
        logger.warn("-----warn级别日志-----");
        logger.error("-----error级别日志-----");
        return JsonData.buildSuccess();
    }
    @RequestMapping(path = "test2")
    public Object logTest2(){
        MDC.put("name","yangche");
        MDC.put("age","25");
        MDC.put("like","wujing");
        logger.trace("-----trace级别日志-----");
        logger.debug("-----debug级别日志-----");
        logger.info("-----info级别日志-----");
        logger.warn("-----warn级别日志-----");
        logger.error("-----error级别日志-----");
        logger.info("");
        MDC.clear();
        return JsonData.buildSuccess();
    }
}

写一个过滤器

package com.filter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import org.springframework.util.StringUtils;
public class SimpleLogFilter extends Filter<ILoggingEvent> {
    @Override
    public FilterReply decide(ILoggingEvent event) {
        System.err.println(event.getMDCPropertyMap().get("name"));
        if(StringUtils.isEmpty(event.getMdc().get("name"))){
            return FilterReply.DENY;
        }else {
            return FilterReply.NEUTRAL;
        }
    }
}

以上过滤器要继承Filter<ILoggingEvent>,在变量event中可以取到mdc的数据,msg,等等等等,可以用java对日志进行自定义的判断,过滤不需要的过滤器,对日志内容进行替换等等,随心所欲。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!--控制台日志-->
    <appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
            </pattern>
        </layout>
    </appender>
    <!--ERROR级别日志-->
    <appender name="fileErrorApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>
                %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
            </pattern>
        </encoder>
        <!-- 设置滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 路径 -->
            <fileNamePattern>log/app.err.%d.log</fileNamePattern>
            <!-- 控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,
            且<maxHistory> 是1,则只保存最近1个月的文件,删除之前的旧文件 -->
            <MaxHistory>1</MaxHistory>
        </rollingPolicy>
    </appender>
    <!--INFO级别日志-->
    <appender name="fileInfoApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <!–
                onMatch="ACCEPT" 表示匹配该级别及以上
                onMatch="DENY" 表示不匹配该级别及以上
                onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
                onMismatch="ACCEPT" 表示匹配该级别以下
                onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
                onMismatch="DENY" 表示不匹配该级别以下的
            –>
            <onMatch>ACCEPT</onMatch>
            <!–<onMismatch>DENY</onMismatch>–>
        </filter>-->
        <filter class="com.filter.SimpleLogFilter"/>  <!--我写的过滤器,过滤的是mdc中name的值为空的日志内容,所以所有name为空值的不会被打印-->
        <encoder>
            <pattern>
                %X{name} %X{age} %X{like}-----%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
            </pattern>
        </encoder>
        <!-- 滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 路径 -->
            <fileNamePattern>log/app.info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>
    <!--root level最低级别-->
    <root level="INFO">
        <appender-ref ref="consoleApp"/>
        <appender-ref ref="fileInfoApp"/>
        <appender-ref ref="fileErrorApp"/>
    </root>
</configuration>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 利用logback 设置不同包下的日志级别

    1.实现效果:项目的整体的日志打印级别为ERROR,但在某个包下或某个类想打印INFO级别的日志. 2.配置: FILE是ERROR级别日志打印: SPECIAL 是INFO级别日志打印: FILE与SPECIAL唯一不同是日志保存路径不同,其它策略相同: 通过 logger标签指定包路径或类路径并引用SPECIAL: <?xml version="1.0" encoding="UTF-8"?> <configuration> <con

  • 关于logBack配置日志文件及编码配置的问题

    记录下使用logback中遇到的问题,方便以后查看 logback输出到文件文件大小设置问题 目前网上能搜到的关于输出到日志文件的大小设置有如下两种: 1.单独的triggeringPolicy标签 若rollingPolicy用SizeAndTimeBasedRollingPolicy,直接复制下面的triggeringPolicy会报错,说无法创建triggeringPolicy component. <rollingPolicy class="ch.qos.logback.core.

  • Java logback日志的简单使用

    说明 logback作为log4j的替代,有很多优势.要将logback应用到项目中,步骤很简单.加入依赖的jar包和配置文件即可. logback.xml中主要元素: <property> 定义属性,定义之后,后文可以通过该变量引用. <appender> 定义日志输出格式.位置.文件分割等.被<logger>或<root>引用. <logger> 定义日志名称及对应的级别.name可以是包名.类名或者单纯的字符串.如果是包名或者类名,那么该包

  • spring boot使用logback日志级别打印控制操作

    因为公司业务需要,需要把性能日志和业务日志分开打印,用elk收集处理,所以需要对不同的业务的日志,打印到不同文件. 使用的是spring boot自带的logback. 首先在yml文件配置logback.xml文件,默认会从resources下找logback.xml文件,找不到会从yml文件中找logging.config下的指定文件. logging: level: DEBUG config: classpath:logback.xml logback.xml是logback的配置文件,可

  • springboot如何使用logback-spring配置日志格式,并分环境配置

    配置不生效的解决办法 注意:如果配置不生效,则说明spring优先加载了其他配置: 解决办法: 添加启动参数 -Dlogging.config=classpath:logback-spring.xml 修改名字为 logback.xml, SpringBoot首先去查找标准的日志配置文件,如果找不到在去找拼接Spring的配置的文件, 标准文件名: "logback-test.groovy", "logback-test.xml", "logback.gr

  • 使用logback屏蔽一些包的日志

    在logback.xml中加上该配置,包名如:com.xxx <logger name="packageName" level="OFF"> </logger> 补充知识:logback,利用java包名对包内所有类定义输出形式 目的 将java package 中的所有类定义一个输出logger,定义它的级别,这样就不用每个类都配置. 测试 配置文件 <?xml version="1.0" encoding=&qu

  • 解决logback的日志文件路径问题

    假如使用绝对路径,没有任何问题,就是移植性不太好. 假如使用相对路径,则要注意当前路径"."是在哪儿? 一般我们都会在配置文件中加入log文件的存储目录,如 本人通过研究测试发现: 1.对于J2SE项目,当前路径为工程所在目录 如我的工程为:D:\test 则使用-/logs生成的日志文件位于:D:\logs 2.对于J2EE项目,当前路径为tomcat\bin所在目录 如我的tomcat路径为:D:\tomcat\bin 则使用-/logs生成的日志文件位于:D:\tomcat\lo

  • springboot项目配置logback日志系统的实现

    记录springboot项目配置logback日志文件管理: logback依赖jar包 SpringBoot项目配置logback理论上需要添加logback-classic依赖jar包: <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> <

  • 使用logback实现日志打印过滤

    logback日志打印过滤 1.只打印sql语句以及参数 <?xml version="1.0" encoding="UTF-8" ?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 设置 logger context 名称,一旦设置不可改变,默认为default --> &l

  • 使用Logback设置日志级别

    Logback设置日志级别 使用Logback设置日志的设置方式现在已经有很多文章说明,本文重点说明不同设置方式的区别和用途.首先列举常用的三种方式,接下来说明其区别. appender中的LevelFilter: 级别过滤器,根据日志级别进行过滤.如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志 <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppende

  • java日志打印的完全使用指南

    目录 一.简介 二.常用日志框架 三.日志级别 四.logback简单介绍 五.常见问题 总结 一.简介 日志打印是java代码开发中不可缺少的重要一步. 日志可以排查问题,可以搜集数据 二.常用日志框架 比较常用的日志框架就是logback, 一些老项目会使用log4j,他们用的都是slf4j-api统一接口. (1) 使用log4j log4j使用: 1. slf4j-api-1.5.11.jar 2. slf4j-log4j12-1.5.11.jar 3. log4j-1.2.15.jar

  • SpringBoot3集成SLF4J+logback进行日志记录的实现

    目录 1 快速实现 2 配置xml 2.1 configuration 2.2 property和springProperty 2.3 root 2.4 appender 2.4.1 ConsoleAppender 2.4.2 FileAppender 2.4.3 RollingFileAppender 2.5 logger 3 更多情形 3.1 日志级别 3.2 日志滚动 3.2.1 时间策略 3.2.2 文件大小策略 3.2.3 时间与文件大小策略 3.3 日志过滤 3.3.1 LevelF

  • 详解Spring Boot配置使用Logback进行日志记录的实战

    spring Boot实战之配置使用Logback进行日志记录 ,分享给大家 在这篇文章中我们将讨论在Spring Boot中使用Logback,在Spring Boot中使用Logback很简单 1.为了测试我们新建两个类 package com.xiaofangtech.sunt.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.an

  • Spring Boot Logback配置日志过程解析

    这篇文章主要介绍了Spring Boot Logback配置日志过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 出于性能等原因,Logback 目前是springboot应用日志的标配: 当然有时候在生产环境中也会考虑和三方中间件采用统一处理方式. 配置时考虑点 支持日志路径,日志level等配置 日志控制配置通过application.yml下发 按天生成日志,当天的日志>50MB回滚 最多保存10天日志 生成的日志中Pattern自

  • Spring boot使用logback实现日志管理过程详解

    Springboot默认集成的就是logback,logback相对来说是优秀于log4j的,log4j2也是参考了logback的设计.本篇就是来看看如何使用logback. 1.导入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency&g

  • springboot使用Logback把日志输出到控制台或输出到文件

    一:日志: 1.配置日志级别 日志记录器(Logger)的行为是分等级的.如下表所示: 分为:OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL 默认情况下,spring boot从控制台打印出来的日志级别只有INFO及以上级别,可以配置日志级别 设置日志级别 logging.level.root=WARN 这种方式只能将日志打印在控制台上 二.Logback日志 spring boot内部使用Logback作为日志实现的框架. Logback和log4j非常相似,如果你对l

  • springboot 配置日志 打印不出来sql的解决方法

    今天整合springboot2 + mybatis + logback 遇到了在日志中sql打印不出来的坑,在网上找了好久,都不是我遇到的问题,这里吐槽一下下现在的博客质量,好多都是抄袭的,也没有标注转载. 先说下要将sql打印到日志的配置 1.在mybatis.xml配置中增加以下配置 <!--指定 MyBatis 增加到日志名称的前缀.--> <setting name="logPrefix" value="m-shop-mybatis-sql.&quo

  • java注解结合aspectj AOP进行日志打印的操作

    在很多系统开发中,我们希望在指定的方法调用之前或者之后能打印出该方法的调用时间以及方法的出参和入参,就可以使用spring的AOP,还可以结合自定义的注解进行进行一些指定参数的打印 例如: 一个分层的架构系统,每层都有自己的指定系统名字,并且每个方法都有自己指定的作用(通过注解指定,在切面的时候取出该参数),而且可以根据注解的指定日志类型(在注解中指定,在切面的时候取出参数进行判断,然后打印相对应的日志格式). 1.首先需要自定义注解: systemName:表示该系统的名称. bizCode:

随机推荐