记一次logback导致服务无响应排查过程

1. 前沿

记录最近收到测试环境服务无响应处理过程。

2. 定位

2.1 排查服务资源使用情况

通过top命令和阿里云监控发现服务cpu和资源都正常,第一反应是死锁。

2.2 导出线程信息

通过jstack -l命令导出线程信息发现服务所有响应到卡住logback的log上,因为以前也遇到logback死锁导致类似异常,发现服务的logback版本是1.1.11版本(该版本有死锁bug)后,愉快的升级到1.2.3版。然而很快的服务还是出现无响应。再仔细观察了logback配置后发现有配置console,又愉快地把console配置删掉。结果又出现无响应
在这里插入图片描述

2.3 导出堆栈信息

旧的版本是正常,查了下这期迭代改动发现什么异常。只好老老实实导出jmap导出堆栈信息下来查看是否异常。通过堆栈信息hsf的AsyncAppenderBase.ArrayBlockingQueue确实已经满了导致了堵塞。
在这里插入图片描述

2.4 查看io是否异常

怀疑是不是io异常导致,联系了运维排查后发现是正常的。其实也符合逻辑,如果是io异常应该是连启动都启动不了,如果是io抖动应该后续也会恢复并且不是必现。

2.5 查看logback代码

旧的版本是正常,查了下这期迭代改动发现什么异常。查看AsyncAppenderBase了解AsyncAppenderBase是通过生产者消费者模式来实现异步log的。
生产者调用append时会把log发在ArrayBlockingQueue里。
在这里插入图片描述

消费者AsyncAppenderBase.Work会取拉取ArrayBlockingQueue的log进行写入。发现AsyncAppenderBase.Work只捕获了InterruptedException异常如果是其他异常就会导致AsyncAppenderBase.Work推出,从而导致AsyncAppenderBase.put都卡住。
在这里插入图片描述
查看了堆栈信息发现服务起了4个AsyncAppenderBase
在这里插入图片描述

但查看线程栈信息却发现只有3个AsyncAppender-Worker-null(公司event-sdk框架在设置异步log时没有设置name导致线程名都是AsyncAppender-Worker-null)。估计很有可能是因为异步消费异常导致线程退出的。
在这里插入图片描述

2.6 修改logback源码确定原因

在这里插入图片描述
修改代码重新部署后,通过postman批量调用服务接口后很快出现无响应,兴奋的查看日志异常后结合代码很快发现了问题原因。由于升级业务方接口版本导致包冲突,从而导致log在消费时json格式化异常,消费线程退出。定位到具体原因后问题也就很快解决了。
在这里插入图片描述

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
logback文件无内容时,可能会有以下几个可能的原因: 1. 配置文件错误:首先需要检查logback.xml或logback.groovy配置文件是否正确。可能存在配置错误,包括错误的路径、错误的标签、缺少必要的配置等等。可以仔细检查配置文件中的每一行并根据logback文档进行修正。 2. 日志级别问题:logback文件中可能设置了较高的日志级别,导致日志没有被录。确保日志级别设置正确,可以尝试将日志级别调整为较低的级别,如DEBUG或TRACE,并重新运行程序,查看是否有日志被录。 3. Appender配置问题:检查是否有正确的appender配置在logback文件中。Appender负责将日志输出到不同的目标,如控制台、文件、数据库等。确保appender被正确配置,包括目标路径、日志文件名等。如果配置正确但仍无法输出日志,可以尝试更换不同的appender来确定是否是appender的问题。 4. 日志输出路径无权限:如果日志文件应该输出到某个特定路径,需要确保该路径对程序有正确的读写权限。可以尝试更改日志输出路径或者给予相应的读写权限。 5. 异常或错误:查看程序运行过程中是否有相关的异常或错误信息输出到控制台。如果有错误发生,可能会导致logback文件无法正常运行。排查并解决这些错误可以使logback文件恢复正常工作。 以上是一些常见的导致logback文件无内容的可能原因和解决方法。需要对具体的情况进行分析和检查,以解决logback文件无内容的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值