一次诡异的日志死锁

本文介绍了在Java开发的作业框架中遇到的一个日志死锁问题。当用户程序接入框架并产生大量日志时,所有线程被卡在logback日志记录处。通过排查jar包冲突、SOA框架日志问题,最终发现是由于用户程序的日志同时写入磁盘和控制台,导致子进程等待父进程读取控制台输出而产生死锁。解决方案是禁止日志输出到控制台,只写入磁盘。
摘要由CSDN通过智能技术生成

先说下项目背景,为了统一公司的schedule job,做了一个job的框架,定时任务统一接入到这个框架里面。

job框架用java开发,原理很简单,解析用户输入的crontab表达式,到了schedule的时间,用ProcessBuilder把用户的程序给带起来。


今天有同事反应,程序在本地可以正常运行,接入job框架后出现大量的SOA远程调用timeout。

第一反应是资源文件加载路径的问题,怀疑是不是读错了配置文件,再三检查发现一切无误。


打印线程堆栈后发现,所有的线程都卡死在了logback记日志的地方,大家都在等待一把锁,堆栈里面没能发现谁持有了这个锁对象。

从以下几点着手排查:

1. 怀疑是jar包冲突,job框架本身使用的logback版本和用户程序使用的logback版本冲突。于是一番折腾,无果。

2. 怀疑是SOA框架里面记日志的地方有冲突,再三check,还是无果。


然后发现用户的log配置,除了写磁盘以外,还会输出到console,于是改了下配置文件,不再输出到console,发现不再死锁。

于是赶紧的查了下jdk里面关于process的描述,摘录如下:

By default, the created subprocess does not have its own terminal or console. All its standard I/O (i.e. stdin, stdout, stderr) operations

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值