Logback中使用TurboFilter实现日志级别等内容的动态修改
可能看到这个标题,读者会问:要修改日志的级别,不是直接修改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级别打印一封相同的内容,这样就实现了对已定义日志的动态修改。
public class ForceWarnFilter extends TurboFilter { @Override public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable throwable) { if (level == Level.ERROR && logger.getName().equals("org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter")) { logger.warn(marker, format, params); return FilterReply.DENY; } return FilterReply.NEUTRAL; } }
为了让上面定义的过滤器生效,需要在logback的配置xml中增加如下配置:
<configuration> <turboFilter class="com.didispace.log.filter.ForceWarnFilter" /> ...... </configuration>
或者也可以在应用主类中增加:
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); lc.addTurboFilter(new MyTurboFilter());
更多关于Logback过滤器的内容可参考官方文档:https://logback.qos.ch/manual...
- SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)
- logback动态修改配置文件实现打印不同级别日志
- log4j2动态修改日志级别及拓展性使用
- Logback动态修改日志级别
- asp.net 使用HttpModule对全站输出的动态页面的HTML内容进行修改,不会错乱
- java使用动态代理来实现AOP(日志记录)的实例代码
- 【使用JSOUP实现网络爬虫】修改数据-设置一个元素的HTML内容
- CMS内容管理系统开发- Java Web开发及发布实例(2)—使用JSP实现动态数据交互
- 使用百度分享实现分享博客内容(分享内容动态)
- 使用logback.xml配置来实现日志文件输出
- SpringBoot使用logback实现日志按天滚动
- Spring Boot 动态修改日志级别
- WinForm中使用XtraGrid控件,实现在界面中动态修改列显示,列名列宽等
- 一个页面实现修改删除列表显示,ajax动态生成table(使用ajax,springmvc,jsp)
- 使用bootstrap tooltip控件动态修改提示内容
- 使用logback实现日志记录
- 运行环境下动态修改日志级别
- 使用Nginx反向代理和内容替换模块实现网页内容动态替换功能
- 使用freemarker实现静态模板维护及动态内容展示案例
- Spring Cloud Spring Boot mybatis分布式微服务云架构(四十五)动态修改日志级别(2)