logback自定义appenderpolicy实现日志打印的逻辑处理

Posted 爪哇之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了logback自定义appenderpolicy实现日志打印的逻辑处理相关的知识,希望对你有一定的参考价值。


以下只贴出核心代码,运行代码详见

https://github.com/GloryXu

背景

目前所在的一个组为api接口平台,需要对注册上的接口进行相应的性能监控。因为是中途接手的项目,对于接口性能的监控比较好奇,就花了点时间了解下,又学了一手,写了个例子,记录下。

代码结构概览

文件名 说明
LogbackMain 应用main启动类
LogPrint 业务类(需要打印日志的类)
HandleAppender logback中自定义的appender处理类
MyPolicy 自定义处理策略

HandleAppender类说明

 
   
   
 
  1. // 注意:这边的属性名一定要与logback.xml中的标签名一致

  2. private MyPolicy myPolicy;

  3. // 同上

  4. private Layout<E> layout;


  5. public void start() {

  6. super.start();

  7. if (this.layout == null) {

  8. this.addStatus(new ErrorStatus("No layout set for the appender named \"" + this.name + "\".", this));

  9. }

  10. }


  11. @Override

  12. protected void append(E eventObject) {

  13. if (this.myPolicy != null) {

  14. this.myPolicy.handler(this.layout.doLayout(eventObject));

  15. }

  16. }

  • 类属性名与xml配置的标签名相同是一个注意点,否则appender类中的属性值为 null

LogPrint类说明

 
   
   
 
  1. protected static final Logger mylogger = LoggerFactory.getLogger("myLogger");


  2. private AtomicInteger count;


  3. public LogPrint(AtomicInteger count) {

  4. this.count = count;

  5. }


  6. private ScheduledThreadPoolExecutor pool = new ScheduledThreadPoolExecutor(1);


  7. public void printInfo () {

  8. pool.scheduleAtFixedRate(() -> {

  9. mylogger.info("print count " + count.incrementAndGet());


  10. mylogger.debug("print debug level log!");

  11. }, 1000, 5000, TimeUnit.MILLISECONDS);

  12. }

以上使用一个定时线程池固定频率模拟业务系统打印日志,触发日志定制化处理功能

MyPolicy类说明

该类比较简单,不再说明 详细可查阅 Github代码

logback.xml配置说明

 
   
   
 
  1. <appender name="myLog" class="com.redsun.logback.HandleAppender">

  2. <!--A.根据设置过滤日志,此处设置的是info-->

  3. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">

  4. <level>INFO</level>

  5. </filter>

  6. <!--B.自定义设置处理策略-->

  7. <myPolicy class="com.redsun.logback.MyPolicy">

  8. <appName>monitor</appName>

  9. </myPolicy>

  10. <!--日志打印格式,m:message-->

  11. <layout class="ch.qos.logback.classic.PatternLayout">

  12. <pattern>%m</pattern>

  13. </layout>

  14. </appender>

  15. <!--C.设置日志级别为info-->

  16. <!--additivity=true,表示将日志输出出来,false则不会输出日志,但是appender仍可接收到输出的日志message-->

  17. <logger name="myLogger" level="info" additivity="true">

  18. <!--指定自定义的appender来处理-->

  19. <appender-ref ref="myLog"/>

  20. </logger>

需要注意的点都已在xml注释中说明,此处不再赘述

运行情况

在打印日志前都会将需要打印的日志发送至 MyPolicy来的 handle中处理一下,此时的逻辑就可以自定义了

缺点

我们项目的运用是在 handle中将打印的日志(接口的运行耗时,成功率等等)发送至 redis中,然后会有另外的项目去定时任务的获取数据并作计算,最终算出这个接口的运行情况。

那么有什么缺点呢,通过上面打印可以发现,打印的线程和真实跑业务的线程是同一个,如果自定义的日志处理逻辑没有任何的阻塞操作就还好,但是一旦有了耗时比较长的操作就会影响接口的性能了,遇到这种问题不熟悉的人往往很难定位到问题是如何产生的。可以根据业务需求,或者真实场景实现异步化处理也未尝不可,当然也要注意资源的分配和控制,不然因为次要功能影响了主要的业务功能就得不偿失了。

以上是关于logback自定义appenderpolicy实现日志打印的逻辑处理的主要内容,如果未能解决你的问题,请参考以下文章

通过LOGBACK实现每个类包或自定义级别

logback自定义转换的问题

logback自定义Pattern模板

logback 发送邮件和自定义发送邮件;java类发送邮件

基于logback的自定义工具包(肥肠实用)

logback自定义格式转换器