资讯专栏INFORMATION COLUMN

容器打印日志到控制台阻塞的排障

aaron / 2282人阅读

摘要:原文今日生产环境发现有些容器停止响应了,但是容器没有死,也能正常使用。在容器内部使用发现的一直处于运行状态但用没有发现有新的日志输出,且访问该应用肯定会输出日志的接口也是没有任何日志输出,因此怀疑阻塞住了。

原文

今日生产环境发现有些容器停止响应了,但是容器没有死,docker exec -it /bin/bash也能正常使用。

在容器内部使用jstack 发现log4j2的Console Appender一直处于运行状态:

"AsyncAppender-asyncConsole" #21 daemon prio=5 os_prio=0 tid=0x00007fd968d07000 nid=0x1f runnable [0x00007fd91bffd000]
   java.lang.Thread.State: RUNNABLE
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:326)
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
    - locked <0x00000000f002b408> (a java.io.BufferedOutputStream)
    at java.io.PrintStream.write(PrintStream.java:480)
    - locked <0x00000000f002b3e8> (a java.io.PrintStream)
    at org.apache.logging.log4j.core.util.CloseShieldOutputStream.write(CloseShieldOutputStream.java:53)
    at org.apache.logging.log4j.core.appender.OutputStreamManager.writeToDestination(OutputStreamManager.java:262)
    - locked <0x00000000f021d848> (a org.apache.logging.log4j.core.appender.OutputStreamManager)
    at org.apache.logging.log4j.core.appender.OutputStreamManager.flushBuffer(OutputStreamManager.java:294)
    - locked <0x00000000f021d848> (a org.apache.logging.log4j.core.appender.OutputStreamManager)
    at org.apache.logging.log4j.core.appender.OutputStreamManager.drain(OutputStreamManager.java:351)
    at org.apache.logging.log4j.core.layout.TextEncoderHelper.drainIfByteBufferFull(TextEncoderHelper.java:260)
    - locked <0x00000000f021d848> (a org.apache.logging.log4j.core.appender.OutputStreamManager)
    at org.apache.logging.log4j.core.layout.TextEncoderHelper.writeAndEncodeAsMuchAsPossible(TextEncoderHelper.java:199)
    at org.apache.logging.log4j.core.layout.TextEncoderHelper.encodeChunkedText(TextEncoderHelper.java:159)
    - locked <0x00000000f021d848> (a org.apache.logging.log4j.core.appender.OutputStreamManager)
    at org.apache.logging.log4j.core.layout.TextEncoderHelper.encodeText(TextEncoderHelper.java:58)
    at org.apache.logging.log4j.core.layout.StringBuilderEncoder.encode(StringBuilderEncoder.java:68)
    at org.apache.logging.log4j.core.layout.StringBuilderEncoder.encode(StringBuilderEncoder.java:32)
    at org.apache.logging.log4j.core.layout.PatternLayout.encode(PatternLayout.java:220)
    at org.apache.logging.log4j.core.layout.PatternLayout.encode(PatternLayout.java:58)
    at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.directEncodeEvent(AbstractOutputStreamAppender.java:177)
    at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:170)
    at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:161)
    at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
    at org.apache.logging.log4j.core.appender.AsyncAppender$AsyncThread.callAppenders(AsyncAppender.java:459)
    at org.apache.logging.log4j.core.appender.AsyncAppender$AsyncThread.run(AsyncAppender.java:412)

但用docker logs -f 没有发现有新的日志输出,且访问该应用肯定会输出日志的接口也是没有任何日志输出,因此怀疑log4j2阻塞住了。

Google到有人在log4j提出了类似了问题LOG4J2-2239,官方给出的解释是问题出在log4j2之外。

于是查一下logback是否也有类似问题,找到LOGBACK-1422,同样给出的解释是问题出在logback之外。

两个问题的共通点都是用docker运行,于是把应用直接进程方式运行,没有出现问题。

于是Google搜索docker logging to stdout hangs,找到SO的这个回答,以及这个issue,解决方案将Docker升级到18.06。

查看生产环境的docker版本是18.03,升级到18.09后问题解决。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27700.html

相关文章

  • 为何把日志打印制台很慢?

    摘要:原文在容器打印日志到控制台阻塞的排障的时候看到一个观点把日志打印到控制台要比打印到文件慢,而且是非常慢。那么为何输出到控制台慢有何办法加速呢问题要从三个角度来分别回答的角度程序角度容器角度角度写到控制台其实就是写到,更严格的说应该是。 原文 在容器打印日志到控制台阻塞的排障的时候看到一个观点: 把日志打印到控制台要比打印到文件慢,而且是非常慢。 log4j2和logback的两个iss...

    dinfer 评论0 收藏0
  • 为何把日志打印制台很慢?

    摘要:原文在容器打印日志到控制台阻塞的排障的时候看到一个观点把日志打印到控制台要比打印到文件慢,而且是非常慢。那么为何输出到控制台慢有何办法加速呢问题要从三个角度来分别回答的角度程序角度容器角度角度写到控制台其实就是写到,更严格的说应该是。 原文 在容器打印日志到控制台阻塞的排障的时候看到一个观点: 把日志打印到控制台要比打印到文件慢,而且是非常慢。 log4j2和logback的两个iss...

    APICloud 评论0 收藏0
  • 容器云 UK8S】常见问题及排障指南:入门必读之Pod 常见命令,Controller 常见命令和

    摘要:入门必读提供了一系列的命令行工具来辅助我们调试和定位问题,本指南列举一些常见的命令来帮助应用管理者快速定位和解决问题。这里以为例,介绍的常用命令其他的命令类型与其一致。入门必读Kubernetes 提供了一系列的命令行工具来辅助我们调试和定位问题,本指南列举一些常见的命令来帮助应用管理者快速定位和解决问题。定位问题在开始处理问题之前,我们需要确认问题的类型,是 Pod ,Service ,或...

    Tecode 评论0 收藏0
  • 恕我直言,你可能误解了微服务

    摘要:刘超,网易云计算首席架构师,有多年的云计算架构与开发经历,积累了丰富的企业级应用的微服务化,容器化实战经验。近日,记者对刘超进行了采访,跟大家分享了微服务实战的挑战和一些常见的微服务误解,以及他对微服务发展趋势的判断。 刘超,网易云计算首席架构师,有10多年的云计算架构与开发经历,积累了丰富的企业级应用的微服务化,容器化实战经验。刘超将担任今年 5 月份 QCon 全球软件开发大会广州...

    AlphaGooo 评论0 收藏0

发表评论

0条评论

aaron

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<