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>
收藏 (0)
评论列表
正在载入评论列表...
我是有底线的
为您推荐
    暂时没有数据