前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >logback自定义appender、policy实现日志打印的逻辑处理

logback自定义appender、policy实现日志打印的逻辑处理

作者头像
RedSheep
修改2019-10-31 22:20:33
2.2K0
修改2019-10-31 22:20:33
举报
文章被收录于专栏:技术男的宅之路

以下只贴出核心代码,运行代码详见 https://github.com/GloryXu

背景

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

代码结构概览

文件名

说明

LogbackMain

应用main启动类

LogPrint

业务类(需要打印日志的类)

HandleAppender

logback中自定义的appender处理类

MyPolicy

自定义处理策略

HandleAppender类说明

代码语言:javascript
复制
// 注意:这边的属性名一定要与logback.xml中的标签名一致
    private MyPolicy myPolicy;
    // 同上
    private Layout<E> layout;

    public void start() {
        super.start();
        if (this.layout == null) {
            this.addStatus(new ErrorStatus("No layout set for the appender named \"" + this.name + "\".", this));
        }
    }

    @Override
    protected void append(E eventObject) {
        if (this.myPolicy != null) {
            this.myPolicy.handler(this.layout.doLayout(eventObject));
        }
    }
  • 类属性名与xml配置的标签名相同是一个注意点,否则appender类中的属性值为 null

LogPrint类说明

代码语言:javascript
复制
protected static final Logger mylogger = LoggerFactory.getLogger("myLogger");

    private AtomicInteger count;

    public LogPrint(AtomicInteger count) {
        this.count = count;
    }

    private ScheduledThreadPoolExecutor pool = new ScheduledThreadPoolExecutor(1);

    public void printInfo () {
        pool.scheduleAtFixedRate(() -> {
            mylogger.info("print count " + count.incrementAndGet());

            mylogger.debug("print debug level log!");
        }, 1000, 5000, TimeUnit.MILLISECONDS);
    }

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

MyPolicy类说明

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

logback.xml配置说明

代码语言:javascript
复制
<appender name="myLog" class="com.redsun.logback.HandleAppender">
        <!--A.根据设置过滤日志,此处设置的是info-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <!--B.自定义设置处理策略-->
        <myPolicy class="com.redsun.logback.MyPolicy">
            <appName>monitor</appName>
        </myPolicy>
        <!--日志打印格式,m:message-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%m</pattern>
        </layout>
    </appender>
    <!--C.设置日志级别为info-->
    <!--additivity=true,表示将日志输出出来,false则不会输出日志,但是appender仍可接收到输出的日志message-->
    <logger name="myLogger" level="info" additivity="true">
        <!--指定自定义的appender来处理-->
        <appender-ref ref="myLog"/>
    </logger>

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

运行情况

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

缺点

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

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

觉得有帮助,欢迎关注
觉得有帮助,欢迎关注
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爪哇之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 代码结构概览
  • HandleAppender类说明
  • LogPrint类说明
  • MyPolicy类说明
  • logback.xml配置说明
  • 运行情况
  • 缺点
相关产品与服务
应用性能监控
应用性能监控(Application Performance Management,APM)是一款应用性能管理平台,基于实时多语言应用探针全量采集技术,为您提供分布式性能分析和故障自检能力。APM 协助您在复杂的业务系统里快速定位性能问题,降低 MTTR(平均故障恢复时间),实时了解并追踪应用性能,提升用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档