可能看到这个标题,读者会问:要修改日志的级别,不是直接修改log.xxx就好了吗?为何要搞那么复杂呢?

所以,先说一下场景,为什么要通过TurboFilter去动态的修改日志级别。我们在使用Java开发各种项目的时候必然的会引入很多框架,这些框架通过堆叠的方式完成所要提供的业务服务(一个服务请求在进入后会在这些框架中兜一圈,然后返回结果),当一个比较底层的框架在处理过程中抛出了异常之后,这个异常会不断的向上传递。这个时候,有的框架直接throw,继续向上抛,而有的在throw之前还会自己打印一下error日志,这就导致了当出现异常的时候,往往会出现一连串类似的错误日志记录。如果对接了错误日志告警,就会出现重复告警的现象。为了解决类似这样的问题,修改源码重新编译最直接,但是不可取。所以希望可以有更好的手段去控制这些已经被编码固化的日志打印信息。当我们使用Logback的时候,TurboFilter就是解决该问题的工具之一。

TurboFIlter不同于之前在[《Logback中如何自定义灵活的日志过滤规则》]一文中介绍的那些通过ch.qos.logback.core.filter.Filter接口实现的过滤器。

ch.qos.logback.core.filter.Filter实现的过滤器是与Appender绑定的,而TurboFIlter是与日志上下文绑定的,它会过滤所有的日志请求,并且TurboFIlter的方法中提供了丰富的可访问信息用来进行控制和改写。

比如下面的实现,通过继承ch.qos.logback.classic.turbo.TurboFilter类,并重写decide方法,将org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter类中原本要打印的ERROR日志DENY掉(过滤掉),同时以WARN级别打印一封相同的内容,这样就实现了对已定义日志的动态修改。

  1. public class ForceWarnFilter extends TurboFilter {

  2.    @Override

  3.    public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable throwable) {

  4.        if (level == Level.ERROR && logger.getName().equals("org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter")) {

  5.            logger.warn(marker, format, params);

  6.            return FilterReply.DENY;

  7.        }

  8.        return FilterReply.NEUTRAL;

  9.    }

  10. }

为了让上面定义的过滤器生效,需要在logback的配置xml中增加如下配置:

  1. <configuration>

  2.    <turboFilter class="com.didispace.log.filter.ForceWarnFilter" />

  3.    ......

  4. </configuration>

或者也可以在应用主类中增加:

  1. LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

  2. lc.addTurboFilter(new MyTurboFilter());

更多关于Logback过滤器的内容可参考官方文档:https://logback.qos.ch/manual/filters.html

-END-

 近期热文:

  • 为什么前后端分离了,你比从前更痛苦?

  • 不改一行代码定位线上性能问题

  • Logback中如何自定义灵活的日志过滤规则

  • HBase优化实战

  • MySQL的索引

  • 漫话:如何给女朋友解释为什么双11无法修改收货地址?

  • Java中生产者与消费者问题的演变

  • 分库分表技术演进&最佳实践

关注我

点击“阅读原文”,看本号其他精彩内容

Logback中使用TurboFilter实现日志级别等内容的动态修改相关推荐

  1. 求你了,别再随便打日志了,教你动态修改日志级别!

    GitHub 19k Star 的Java工程师成神之路,不来了解一下吗! 之前写过一篇文章<明明有自动清理,日志还是把我的服务干爆了!>,介绍过一次大促故障,是因为日志量激增,导致服务器 ...

  2. 改logback logstash-logback-encoder 框架本身的日志级别

    大家好,我是烤鸭: 最近遇到一个问题,想把logback框架本身的日志级别修改,需要 logstash-logback-encoder 6.1 以上的版本才可以. 直接上代码 这里修改的不是业务日志级 ...

  3. 【Spring】Spring 如何更改动态更改运行中某个类的日志级别

    1.概述 因为上线的程序,我们一般在程序中打印了日志级别为INFO,但是代码中有一些是debug的日志,但是我们线上环境肯定不能打debug日志. 打debug日志,会导致打印了很多无用的日志,占用磁 ...

  4. 微信小程序修改数组中的元素_微信小程序——this.setData()动态修改数组中的某一值...

    微信小程序--this.setData()动态修改数组中的某一值S8v编程技术_踩坑日志_进阶指南_无知人生 大家是不是都觉得微信小程序的开发方式和 vue react 这种框架的开发方式很像?S8v ...

  5. java中spring的级别_java – 在简单的示例项目中更改Spring框架日志级别?

    这是Spring Boot的工作,它通过slf4j处理日志路由jul,jcl和log4j,并通过slf4j使用Logback,正如您可以通过可区分的缩写命名空间类名称来判断的. 通过直接在pom文件上 ...

  6. 手写logback_springboot logback调整mybatis日志级别无效的解决

    springboot logback调整mybatis日志级别无效的解决 现象 在日志配置文件 logback-spring.xml 中,无论怎么修改级别,mybatis 的 sql 日志都会打印出来 ...

  7. 实现Log4j和Logback的统一日志封装与动态日志级别调整

    一.背景 项目中使用日志的地方非常广泛, 如果要做统一的处理,比如调整格式, 增加信息打印, 要修改很多地方,难以维护,所以需要能够将日志做一个统一的封装, 便于扩展使用:同时想做到动态调整日志级别, ...

  8. linux 内核日志等级,Linux系统中日志级别详情

    日志信息分类 1.等级由低到高:debug 2.区别: debug 级别最低,可以随意的使用于任何觉得有利于在调试时更详细的了解系统运行状态的东东: info  重要,输出信息:用来反馈系统的当前状态 ...

  9. LogBack 动态修改日志级别

    由于线上运行的项目,出现问题 想看下sql的参数,或者一些框架的debug日志.需要把日志界别从info-->debug.需要动态实时的修改日志界别. 只要类: LoggersEndpoint ...

最新文章

  1. Java volatile 的测试(Java代码实战-004)
  2. 【刷算法】两个链表的第一个公共结点
  3. 王道计算机考研 数据结构 (图-下)
  4. SM_INTEGRATION_SRV
  5. (效果一)js实现上拉加载
  6. Java面试题,java工程师求职简历
  7. spring学习(40):注入数组类型
  8. 信息安全工程师笔记-数据库安全
  9. 【codevs1722】【NOI1997】最优乘车,单元最短路?
  10. Docker 日常指令
  11. CentOS下Red5安装
  12. C++ 输出Unicode字符的正确方法
  13. 淘宝客APP源码 社交电商uniapp开发源码 前端源码自营商城
  14. 白云机场停车费一天要多少钱,广州白云机场t2航站楼最近停车场
  15. STM32F107+LAN8720A使用STM32cubeMX配置网络连接+tcp主从机+UDP app
  16. Word前几页是罗马数字,后面是阿拉伯数字怎么设置
  17. 关于Visual Studio 2008调试的一些经验以及错误(0xXXXXXXXX处最可能的异常: 0xC0000005: 写入位置 0x00000014 时发生访问冲突)
  18. 《徐卓-心理咨询师校园报告 》--心得
  19. 【COMSOL】在结构力学中使用自定义外部材料模型 · Mazars 损伤模型
  20. 从ECU和CPU视角理解AutoSar网络管理

热门文章

  1. 数字货币 矿池 矿场 区别
  2. mysql \g和\G的作用
  3. windows查看系统信息方法
  4. golang 映射 map 简介
  5. linux信号(signal) 机制分析
  6. java浮点数化为整数_如何在JavaScript中将浮点数转换为整数?
  7. qt widget 窗口拉伸_QTDesigner的QVBoxLayout自动随窗口拉伸
  8. c++ socket 连接超时_Web性能优化之-HTTP长连接
  9. linux 内存泄露工具,linux下检查内存泄露的工具--mtrace
  10. java安装_Java开发中更多常见的危险信号