logback过滤部分日志输出的操作

目录
  • logback过滤部分日志输出
    • 场景
    • 日志过滤
  • Logback 自定义灵活的日志过滤规则
    • 下面是一个只记录日志级别为ERROR的例子
    • 下面举一个简单的例子

logback过滤部分日志输出

场景

使用监控异常日志进行告警时,部分异常日志可能只是不需要告警,但无法通过编码去除时,可以通过不输出这类异常日志达到忽略告警的目的。

比如在系统中经常会出现断开的管道的相关问题,异常如下

org.apache.catalina.connector.ClientAbortException: java.io.IOException: 断开的管道
org.apache.catalina.connector.ClientAbortException: java.io.IOException: broken pipe
[587ce8c8] Error [reactor.netty.ReactorNetty$InternalNettyException: java.nio.channels.ClosedChannelException] for HTTP GET "/xxxx", but ServerHttpResponse already committed (200 OK)

有因为使用框架的原因异常无法捕获,在不改源码的情况下可以通过是用日志过滤的方式处理。

日志过滤

基于logback的基础上引入jar包,不引入无法启动。

        <!--日志过滤-->
        <dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>commons-compiler</artifactId>
            <version>3.0.12</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>janino</artifactId>
            <version>3.0.12</version>
        </dependency>

添加过滤条件

        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
             <!--增加日志匹配处理-->
            <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
                <!--匹配处理器-->
                <evaluator>
                    <!-- 处理模式,默认为 ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
                    <!-- 存在某个字符串则匹配成功 -->
                    <expression>return message.contains("broken pipe");</expression>
                    <!-- <expression>return message.contains("broken pipe")
                        || message.contains("断开的管道") ;</expression> -->
                </evaluator>
                <!--匹配则停止执行日志输出-->
                <OnMatch>DENY</OnMatch>
                <!--不匹配则往下执行-->
                <OnMismatch>ACCEPT</OnMismatch>
            </filter>
            <!--调用其他日志处理-->
            <appender-ref ref="KAFKA"/>
        </appender>

Logback 自定义灵活的日志过滤规则

当我们需要对日志的打印要做一些范围的控制的时候,通常都是通过为各个Appender设置不同的Filter配置来实现。在Logback中自带了两个过滤器实现:ch.qos.logback.classic.filter.LevelFilter和ch.qos.logback.classic.filter.ThresholdFilter,用户可以根据需要来配置一些简单的过滤规则,下面先简单介绍一下这两个原生的基础过滤器。

ch.qos.logback.classic.filter.LevelFilter过滤器的作用是通过比较日志级别来控制日志输出。

下面是一个只记录日志级别为ERROR的例子

<appender name="ERROR_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/error.log</file>ds
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
    </encoder>
</appender>   

LevelFilter通过定义日志级别,并设置匹配与不匹配的处理策略来控制针对某个级别日志的输出策略。

当我们要设置多个不同级别的日志策略的时候,如果仅依靠这个过滤器,我们就要级联的定义多个filter来控制才能实现,显然不是很方便,所以此时我们就可以使用ch.qos.logback.classic.filter.ThresholdFilter过滤器来控制了。

比如下面的配置,实现了只记录WARN及以上级别的控制,比WARN级别低(如:INFO、DEBUG、TRACE)都不会记录。

<appender name="WARN_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/warn_error.log</file>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>WARN</level>
    </filter>
    <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
    </encoder>
</appender>    

通过上述介绍的两个过滤器来控制日志的记录级别已经满足绝大部分的需求,但是可能还是会出现一些特殊情况,需要自定义复杂的过滤规则,比如想过滤掉一些框架中的日志,通过自带的几个过滤器已经无法完全控制,并且也不希望修改框架源码来实现。这个时候,我们就可以自己来实现过滤器,并配置使用。实现的方式也很简单,只需要实现Logback提供的ch.qos.logback.core.filter.Filter接口即可。

下面举一个简单的例子

public class MyFilter extends Filter<ILoggingEvent> {
    @Override
    public FilterReply decide(ILoggingEvent event) {
        if (event.getLevel() == Level.ERROR) {
            switch (event.getLoggerName()) {
                case "org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter":
                    return FilterReply.DENY;
            }
            return FilterReply.ACCEPT;
        }
        return FilterReply.DENY;
    }
}

上面过滤器的功能主要是通过重写decide,限制了org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter类输出ERROR级别的日志记录。在编写好自己的过滤器实现之后,只需要在Appender中配置使用就能实现自己需要的灵活过滤规则了:

<appender name="WARN_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/warn_error.log</file>
    <filter class="com.didispace.log.filter.ExceptionClassFilter"></filter>
    <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
    </encoder>
</appender>    

更多关于Logback过滤器的内容可参考官方文档

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

(0)

相关推荐

  • Logback日志基础及自定义配置代码实例

    Logback日志基础配置 logback日志配置有很多介绍,但是有几个非常基础的,容易忽略的.下面是最简单的一个配置,注意加粗的描述 <?xml version="1.0" encoding="UTF-8"?> <configuration debug="true" scan="true" scanPeriod="30 seconds"> <!--log.path定义的是局部

  • logback使用filter过滤日志操作

    笔者语录: 我发现我喜欢捣鼓一些小玩意儿,虽然官网(见文末)写得很明白了,但是咱们对感兴趣的部分来敲一遍代码好吧. 过滤器简介: 简介 logback具有过滤器支持.logbcak允许给日志记录器appender配置一个或多个Filter(或者给整体配置一个或多个TurboFilter),来控制:当满足过滤器指定的条件时,才记录日志(或不满足条件时,拒绝记录日志).logback支持自定义过滤器,当然logback也自带了一些常用的过滤器,在绝大多数时候,自带的过滤器其实就够用了,一般是不需要自

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

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

  • 使用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 自定义灵活的日志过滤规则 下面是一个只记录日志级别为ERROR的例子 下面举一个简单的例子 logback过滤部分日志输出 场景 使用监控异常日志进行告警时,部分异常日志可能只是不需要告警,但无法通过编码去除时,可以通过不输出这类异常日志达到忽略告警的目的. 比如在系统中经常会出现断开的管道的相关问题,异常如下 org.apache.catalina.connector.ClientAbortException: java.i

  • logback自定义json日志输出示例详解

    目录 前言 依赖的jar maven坐标 配置Appender节点 appender配置说明: 配置logger节点 logger配置说明: 前言 先说下楼主的使用场景吧,将程序的某些方法调用以json格式的内容记录到文件中,提供给大数据做数据分析用.当然这个需求实现起来很简单,通过aop拦截切面统一输出内容到文件即可.下面要介绍的就是通过logback日志体系以及logstash提供的json log依赖将数据以json格式记录到日志文件的例子. 依赖的jar logstash-logback

  • 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

  • Slf4j+logback实现JSON格式日志输出方式

    目录 Slf4j+logback实现JSON格式日志输出 依赖 logback 记录JSON日志 Slf4j+logback实现JSON格式日志输出 依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> <scope>provided</s

  • 输出执行操作和打印日志的shell脚本实例

    cat /mnt/log_function.sh #!/bin/bash #log function ####log_correct函数打印正确的输出到日志文件 function log_correct () { DATE=`date "+%Y-%m-%d %H:%M:%S"` ####显示打印日志的时间 USER=$(whoami) ####那个用户在操作 echo "${DATE} ${USER} execute $0 [INFO] $@" >>/v

  • 使用Filter过滤python中的日志输出的实现方法

    事情是这样的,我写了一个tornado的服务,过程当中我用logging记录一些内容,由于一开始并没有仔细观察tornado自已的日志管理,所以我就一般用debug来记录普通日志,error记录有问题的日志,但是当服务跑起来以后才发现,tornado的访问日志的级别是info,也就是20,debug是10的,所以如果我定义了日志的级别是debug,那么默认情况下肯定也会输出到日志文件中的. 但是我现在并不关心访问日志,而且由于我这个服务可能每时每刻都会有访问,这样在我对日志信息进行搜索的时候就会

  • paramiko使用tail实时获取服务器的日志输出详解

    基本思路 现在有这么一个需求需要实现自动化:需要实时获取服务器cpu,gpu温度以及传感器信息上报情况,对高低温环境下对于设备运行状态的影响进行测试.基本思路为利用paramiko ssh到服务器上,起一个线程用tail -f命令实时获取日志输出,起另外一个线程用'cat /sys/class/thermal/thermal_zone0/temp'命令定时获取cpu,gpu温度. 代码 def get_report_info_perid(self, cmd, diff_time, thre_ti

  • logback如何自定义日志存储

    目录 logback自定义日志存储 1.配置lockback.xml 2.配置自定义日志操作类 3.调用方法 使用logback进行系统日志记录 logback自定义日志存储 1.配置lockback.xml <?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="LOG_HOME" value="/wzwsq-log&q

  • Java Fluent Mybatis 分页查询与sql日志输出详解流程篇

    目录 前言 准备数据 Sql日志配置 官方分页查询 PageHelper分页查询 总结 前言 接着我上一章:Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下 上一章我把项目做了一部分工程化包装,主要还是想要之后的调试能够方便一些.那么这一章接着上一章的内容,做一下查询分页,并且将每次请求所调用的sql语句写在日志里面,便于我们观察定位问题.代码之后还是会上传到github. GitHub代码仓库地址:GitHub仓库 准备数据 简单的准备了一些数据. Sql日志配置 之

  • Springboot异常日志输出方式

    目录 lombok插件使用 统一异常处理 统一日志输出 配置日志级别↓ Logback日志↓ 配置logback日志↓ 安装idea彩色日志插件:grep-console 复制粘贴即可 lombok插件使用 引入依赖,在项目中使用Lombok可以减少很多重复代码的书写.比如说getter/setter/toString等方法的编写 ↓ <!--lombok用来简化实体类--> <dependency> <groupId>org.projectlombok</gro

随机推荐