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)

大家都在看

  • MAC MySQL安装配置

    1. 下载 注意选择对应的版本,M系列芯片对应ARM 2. 安装 一直点击继续即可, 注意要记住root用户端密码 3. 配置 在 ~/.bash_profile 增加 4. 服务…

    数据库 2023年6月14日
    0100
  • PHP str_repeat()

    str_repeat str_repeat() 函数把字符串重复指定的次数。 示例: function strRepeat() { echo str_repeat("*&…

    数据库 2023年6月14日
    071
  • Shell 中 [[]]和[]的区别

    多数情况下 []和 [[]]是可以通用的,两者的主要差异是: test或 []是符合POSIX标准的测试语句,兼容性更强,几乎可以运行在所有Shell解释器中,相比较而言 [[]]…

    数据库 2023年6月14日
    083
  • Linux定时任务调度

    任务调度是指系统在某个时间执行特定的命令或程序,任务调度主要有两种,第一种是系统工作,需要周而复始的执行,比如病毒扫描。第二种是个人用户工作,用户需要在某个特定的事件执行某些程序,…

    数据库 2023年6月16日
    092
  • JavaWeb过滤器Filter(附tomcat部分源码分析)

    过滤器Filter 过滤器通常对一些web资源进行拦截,做完一些处理器再交给下一个过滤器处理,直到所有的过滤器处理器,再调用servlet实例的service方法进行处理。过滤器可…

    数据库 2023年6月16日
    0122
  • RadonDB MySQL on K8s 2.1.3 发布!

    RadonDB MySQL Kubernetes 于 3 月 24 日正式发布新版本 2.1.3 。该版本主要基于在 2.1.2 进行功能优化和升级。 首先感谢 @andyli02…

    数据库 2023年5月24日
    089
  • 浏览器书签插件配置

    准备远程Git仓库(目前只支持Gitee) 登录后创建仓库(如没有账号请自行注册) 配置Token 进入设置页面配置私人令牌 新增一个令牌(权限) 保存好生成的令牌,此令牌后续无法…

    数据库 2023年6月9日
    083
  • Nginx 配置参数优化

    nginx 配置参数优化 nginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求。以下的配置参数是借鉴网上的一些调优参数,仅作为参考,不见得适于你的线上业…

    数据库 2023年6月6日
    089
  • AI 音辨世界:艺术小白的我,靠这个AI模型,速识音乐流派选择音乐 ⛵

    💡 作者:韩信子@ShowMeAI📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40📘 机器学习实战系列:https://www.s…

    数据库 2023年6月14日
    086
  • centos7 打包chrome离线安装包流程

    前提,centos可以连接外网 1、在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repo 文件中添加以下内容: 2、安装 yum-utils…

    数据库 2023年6月11日
    085
  • python_numpy数组入门

    NumPy 数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。 在 NumPy中,每一个线性的数组称为是一个轴(axis…

    数据库 2023年6月11日
    089
  • 记一次Orika使用不当导致的内存溢出

    hprof 文件分析 2021-08-24,订单中心的一个项目出现了 OOM 异常,使用 MemoryAnalyzer 打开 dump 出来的 hprof 文件,可以看到 91.2…

    数据库 2023年6月6日
    094
  • 字节一面:事务还没提交的时候,redolog 能不能被持久化到磁盘呢?

    又是被自己菜醒的一天,总结面经看到这题目听都没听过,打开百度就像吃饭一样自然 老规矩,背诵版在文末。点击阅读原文可以直达我收录整理的各大厂面试真题 首先,咱需要明白的是,啥是持久化…

    数据库 2023年6月6日
    0123
  • Question04-查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

    * SELECT stu.SID, stu.Sname, IFNULL(CAST(AVG(sc.score) AS DECIMAL(18,2)), 0) 平均成绩 FROM Stu…

    数据库 2023年6月16日
    084
  • Activiti7 多实例子流程

    顾名思义,子流程是一个包含其他活动、网关、事件等的活动,这些活动本身形成了一个流程,该流程是更大流程的一部分。 使用子流程确实有一些限制: 一个子流程只能有一个none类型的启动事…

    数据库 2023年6月14日
    0158
  • 云数据库技术|“重磅升级”后再测 TDSQL-C

    标题 1.摘要 前段时间,测试了国内主要云原生数据库 PolarDB、TDSQL-C、GaussDB 的性能,参考:《再测云原生数据库性能》。在上次测试结果中,由于地域版本差异,腾…

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