Karaf 4.1.3/4.1.4调试级日志下客户端连接后僵死问题求助
解决方案:Karaf 4.1.3/4.1.4 log:tail 触发容器僵死及递归日志错误
我之前碰到过这个问题,这是Karaf 4.1.x版本里的一个已知问题,核心原因是SSHD组件(1.6.0版本)的debug日志与log:tail命令形成循环输出,再加上RMI调度线程触发了PaxOsgi appender的递归调用,最终导致整个容器僵死。下面是几个可行的解决办法:
1. 优先升级Karaf版本(推荐)
这个问题在Karaf 4.2.x及更高的稳定版本中已经被官方修复——他们更新了SSHD组件的版本,同时调整了日志处理的逻辑,从根源上避免了循环输出的问题。你可以直接下载最新的纯净版Karaf(比如4.2.16或更高)替换现有版本,解压后就能正常使用,不需要额外配置。
2. 不升级的临时修复方案
如果暂时无法升级,可以通过修改日志配置来规避问题:
- 降低SSHD组件的日志级别:
编辑Karaf安装目录下的etc/org.ops4j.pax.logging.cfg文件,添加或修改以下配置,把SSHD的日志级别从DEBUG调到INFO(或更高),避免触发循环日志:log4j2.logger.sshd.name = org.apache.sshd log4j2.logger.sshd.level = INFO - 过滤RMI调度线程的日志:
同样在上述配置文件中,找到log4j2.appender.PaxOsgi相关配置块,添加线程过滤规则,阻止RMI调度线程触发递归调用:
保存配置后重启Karaf容器,再用log4j2.appender.PaxOsgi.filter.type = ThreadContextMapFilter log4j2.appender.PaxOsgi.filter.onMatch = ACCEPT log4j2.appender.PaxOsgi.filter.onMismatch = DENY log4j2.appender.PaxOsgi.filter.thread.name.type = StringMatchFilter log4j2.appender.PaxOsgi.filter.thread.name.stringToMatch = RMI Scheduler log4j2.appender.PaxOsgi.filter.thread.name.onMatch = DENY log4j2.appender.PaxOsgi.filter.thread.name.onMismatch = NEUTRALclient.sh -d log:tail执行操作,就不会再出现僵死和递归错误了。
3. 临时规避技巧
如果只是临时需要查看日志,可以不用debug级别连接Karaf客户端,直接运行:
./client.sh log:tail
这样不会触发SSHD的debug日志,自然也就不会引发循环输出的问题。
内容的提问来源于stack exchange,提问作者Skynet5
相关产品推荐
相关产品推荐

