SkyWalking Agent端日志插件的编写历程与使用说明

前一段时间顺利完成了SkyWalking Agent端logger-plugin插件的开发,在此做个总结。一方面给插件的使用方法写一中文说明,另一方面分享一下该插件开发过程中的一些考量以及收获。

logger-plugin插件,主要作用实现将将程序在调用过程中产生的日志比如错误日志信息,存入到span log中。然后可以通过web端直接查询,便于开发者排错与分析。同时为了提高使用的灵活性,我们还提供了配置文件,通过配置文件可以对需要存入到span log的日志来源(log4j2、logbak、log4j)、包名、日志级别、内容进行控制。但同时需要提醒的一点是,由于该插件直接作用于agent端,可能会造成一定程度的 性能损失,请谨慎使用。

基于性能的考量,该插件在设计之初定位为可选插件,因而默认情况下该插件的功能并不会启动。如需使用,需要在8.4.0发布之后,将插件从 apache-skywalking-apm-bin/agent/optional-plugins/目录下复制到 apache-skywalking-apm-bin/agent/plugins/下,方能生效。

配置文件

首先需要说明的一点是,发布时默认是没有配置文件的,插件会按照如下默认配置内容运行:

log4j.packages=*
log4j.level=error
log4j2.packages=*
log4j2.level=error
logback.packages=*
logback.level=error

上述配置文件含义如下:

.如果需要自定义插件的配置信息,需要在 apache-skywalking-apm-bin/agent/config/logger-plugin/目录下创建 logconfig.properties文件进行配置。

配置文件可配置内容及其含义如下:

packages

含义:指定需要转存的日志信息的包名,默认匹配所有包。

取值:

  • 包名:例如org.apache。若有多个包名中间需用逗号隔开
  • *:匹配所有包级别的日志信息。

Level

含义:所需转存的日志信息的级别,默认情况是 error级别的日志信息

日志级别从小到大排列如下:

trace < debug < info < warn< error < fatal

同时我们在自定义配置信息的时候需要注意,由于logback不支持 fatal级别的日志信息,因而如果错误的进行如下配置:

logback.level=error

则会造成针对logback的配置失效,也即不会收集任何关于logback日志插件产生的日志信息,并会产生错误日志,以供用户排查。

其实这个插件刚开始插件之初,由于个人工程经验不足,当时考虑想要实现功能很多,比如需要支持正则表达式用以过滤,支持日志的格式化配置等等。但在和其他社区成员的讨论过程中发现,需要功能其实和该插件的定位不同,比如过滤日志信息的功能,日志系统中已经支持了。如果该插件再增加该功能一方面会增加插件使用的复杂程度,另一方面,也会造成更大的性能损耗。而针对另一功能日志的格式化,这与该插件的定位也是不符合的,apm系统本身就是为了实现追踪和快速定位,对收集到的日志信息希望尽量简练,有效,许多格式化的信息,根本无需收集。因而该功能最终也被废止。

同时针对日志转存到span的格式,和社区成员也进行仔细的沟通,为了适应未来SkyWalking的日志查询功能,因此在转存日志信息时,存储到OAP端的span log日志是结构化的类似于下面的形式:

"logs": [
  {
    "time": 1605225365711,
    "data": [
      {
        "key": "event",
        "value": "warn"
      },
      {
        "key": "log.kind",
        "value": "org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener.MultiScopesAnalysisListener"
      },
      {
        "key": "message",
        "value": "span {} has illegal status code {}"
      },
      {
        "key": "param.1",
        "value": "*span*"
      },
      {
        "key": "param.2",
        "value": "*tag.getValue()*"
      }
    ]
  }
]

同时在设计的过程中,刚开始找到插入点也是不合理的,比如刚开始选择的直接增强sl4j.Logger接口,这回造成一个问题,一旦用户没有使用Log4j创建Logger对象就会造成日志插件失效,最终在BFergerson的帮助下,换成了一个更加合理的插入点。

这篇文章更多的可能是个人在开发logger-plugin插件过程中踩过坑的总结吧,在整个开发过程中,其实收获蛮多的,比如并非一个软件功能越多越好。这个需要从该软件本身的定位出发,兼顾性能和易用性,做到一种平衡。同时简单写了写logger-plugin插件的使用方法,希望能够给感兴趣的同学以帮助。

Original: https://www.cnblogs.com/goWithHappy/p/logger-plugin.html
Author: vcjmhg
Title: SkyWalking Agent端日志插件的编写历程与使用说明

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/599331/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SQLZOO练习5–join(表的连接)

    game表: idmdatestadiumteam1team2 1001 8 June 2012 National Stadium, Warsaw POL GRE 1002 8 J…

    数据库 2023年6月16日
    0111
  • 没有 Cgroups,就没有 Docker

    Cgroups 是什么? Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以 限制、 记录、 隔离进程组(progress groups)…

    数据库 2023年6月6日
    0150
  • MySQL锁:02.InnoDB锁

    传送门:MySQL锁:01.总览传送门:MySQL锁:02.InnoDB锁传送门:MySQL锁:03.InnoDB行锁 InnoDB锁 InnoDB行锁实现机制 InnoDB隐式、…

    数据库 2023年6月16日
    0118
  • Java的try-resource

    原来是这个,这个是之前的try catch,包括最后进行关流等操作。 private String getBodyString(final ServletRequest reque…

    数据库 2023年6月11日
    091
  • Mysql索引底层数据结构与算法

    一.索引概述是什么:索引是帮助MySQL高效获取数据的排好序的数据结构,索引叫”键”,优化好一个索引,可以提高数倍的性能, 类似于字典的音序表为什么要键索引…

    数据库 2023年6月11日
    0136
  • 吃饱年代

    Original: https://www.cnblogs.com/life2refuel/p/15211899.htmlAuthor: 喜欢兰花山丘Title: 吃饱年代

    数据库 2023年6月9日
    0137
  • web开发模式

    前后端不分离 返回的是html的内容,需要在服务端拿到数据库的数据,再渲染给模板层,最后将渲染好的模板返回给浏览器! 前后端分离 前后端分离:只需要在浏览器上运行JS代码,使用aj…

    数据库 2023年6月14日
    0123
  • MySQL快速创建800w条测试数据表&深度分页

    MySQL快速创建800w条测试数据表&深度分页 如果一条一条插入普通表的话,效率太低下,但内存表插入速度是很快的,可以先建立一张内存表,插入数据后,在导入到普通表中。 1…

    数据库 2023年6月14日
    0123
  • 牛客SQL刷题第三趴——SQL大厂面试真题

    结果,保留了两位小数,并根据播放进度以相反的顺序进行排序。 [En] As a result, two decimal places are retained and sorted…

    数据库 2023年5月24日
    0147
  • Virtualbox中ubuntu18配置静态ip地址及DNS

    python开发环境:VirtualBox+Ubuntu18.04 每当我重启电脑重新打开VirtualBox,Ubuntu中的IP地址都会改变,这样,我的开发软件的连接解析地址也…

    数据库 2023年6月6日
    0144
  • Vuex 简单使用

    官网:https://vuex.vuejs.org/zh/ 参考文章:https://www.cnblogs.com/chinabin1993/p/9848720.html Vue…

    数据库 2023年6月16日
    0114
  • Spring AOP

    AOP简介: 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 *作用:在不惊动原始设计的基础上为其进行功能增强。 AOP核心概念 (1)Aspec…

    数据库 2023年6月16日
    0119
  • 分享攒了多年的mssql脚本

    分享攒了多年的mssql脚本 脚本类别包括:备份还原表分区常用函数错误日志定时自动抓取耗时SQL并归档发邮件脚本模块镜像批量脚本数据库收缩数据库损坏数据库账号统计数据库大小性能作业…

    数据库 2023年6月9日
    0125
  • ArrayLIst在指定位置插入的内部实现

    今天看到一个问题:ArrayList的add方法有两种使用,那么add到指定位置内部是怎么实现的? 发现自己对这块地方不熟悉,所以立马去看了ArrayList下的源码 // 第一个…

    数据库 2023年6月9日
    0107
  • [javaweb]监听器统计网页在线人数

    监听器 1.配置监听器 package com.javaweb.controller; import javax.servlet.ServletContext; import ja…

    数据库 2023年6月16日
    0115
  • 2022年5月数据库排名

    数据来源:https://db-engines.com/en/ranking Original: https://www.cnblogs.com/chujian007/p/1631…

    数据库 2023年6月11日
    0100
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球