原文

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

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

"AsyncAppender-asyncConsole" #21 daemon prio=5 os_prio=0 tid=0x00007fd968d07000 nid=0x1f runnable [0x00007fd91bffd000]java.lang.Thread.State: RUNNABLEat 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 <container-name>没有发现有新的日志输出,且访问该应用肯定会输出日志的接口也是没有任何日志输出,因此怀疑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后问题解决。

容器打印日志到控制台阻塞的排障相关推荐

  1. log日志:打印日志到控制台、文件、日志文件分区、打印错误日志到文件

    springboot默认会加载classpath:logback-spring.xml文件 如果需要自定义文件名称,在application.properties中配置logging.config 选 ...

  2. python打印日志(控制台内容输出)

    你是否遇到过这样几个问题: 1.获取控制台打印的内容,并且想要保存下来 2.代码本来运行的好好的,但是由于新增内容,出现bug,加入了异常处理(try...),把不满足条件的先过滤掉.这时需要查看过滤 ...

  3. linux启用日志记录功能,Linux下启用Open vSwitch的日志功能以便调试和排障

    问题 我试着为我的Open vSwitch部署排障,鉴于此,我想要检查它的由内建日志机制生成的调试信息.我怎样才能启用Open vSwitch的日志功能,并且修改它的日志等级(如,修改成INFO/DE ...

  4. idea 控制台 彩色打印日志

    idea 控制台 彩色打印日志 idea 控制台 彩色打印日志 IDEA右上角:Edit Configurations,点击,找到VM options,填入-Dspring.output.ansi.e ...

  5. slf4j没有在linux中生成日志,logback+SLF4J 没打印日志

    logback+SLF4J 没打印日志 为什么?启动时正常,但调用logger.info没打印日志,控制台和文件都没有输出. jar: logback-ext-spring-0.1.3-SNAPSHO ...

  6. springboot的log4j2日志不打印,且控制台不输出!!!

    不打印日志,并且连简单的nullporint等异常都不输出!!! 不报错 问题出在哪呢?  碰到这种问题  . 检查日志的配置文件 具体配置      ,可自行百度...... 情况1: 在配置都正确 ...

  7. slf4j+log4j打印日志,控制台无日志输出

    slf4j+log4j 实现日志打印 项目场景: 今天看以前的项目,运行起来报错,项目日志对于项目是很重要的,但是控制台没有打印出来日志,运行起来报错的问题先放一放,先把日志的问题解决了,我项目中有l ...

  8. IDEA控制台为什么不打印日志

    有的时候会发现IDEA的控制台不打印日志,有时候打印,这是为什么呢. 我遇到的一种原因是:其实打印了日志,你没注意而已. 原因 如果日志太长,则会缩成 <1 internal call> ...

  9. springmvc使用log4j2的配置,以及解决controller日志只有控制台打印日志,不生成本项目文件夹下

    文章目录 1.引包 2. log4j2.xml的配置 3.配置文件中的一些说明 springmvc使用log4j2的配置,以及只有控制台打印日志,不生成文件的解决方式,mvc使用log4j2时会出现在 ...

最新文章

  1. oracle安装清单过不去,oracle 11g(二)安装过程
  2. oracle 12C(12.2.0.1)安装-plm系统(一)
  3. hdu 1016 Prime Ring Problem(DFS)
  4. Spring Boot 配置加载顺序详解
  5. 百度兴趣点下载工具设计和实现
  6. mybatis学习(50):嵌套查询
  7. B样条曲线介绍和实现(等值线平滑)
  8. 数据分析师的前世今生
  9. Atitit.加密算法ati Aes的框架设计
  10. 零基础入门数据挖掘,看完这份详细的学习指南就够了!(附资料)
  11. 一篇彻底搞懂-->shell脚本
  12. Android开发 应用软件更新通用方式--强制/非强制/远程控制/浏览器 更新
  13. Windows 错误码整理
  14. c语言浮点数乘法算法,单精度浮点数乘法的实现
  15. 携程显示连接不到服务器,携程:网络故障由员工错误操作导致
  16. 气体传感器的市场状况及主要厂商
  17. TIDB 性能测试(TIUP-TPCC)
  18. 【机器人】工业机器人如何赋能3C制造升级?工业机器人的16项重要应用;工业机器人的11个知识问答,“业内人”必看!
  19. java怎么实现按键音_实例:使用Javascript制作声音按钮
  20. HorizontalScrollview+recycleview实现横向滑动

热门文章

  1. codecomb 2091【路径数量】
  2. enyo官方开发入门教程翻译一Controls之Buttons
  3. C++ primer 1.2 初窥输入输出流
  4. 模板参数仅作为函数的返回值
  5. 第24天学习Java的笔记-接口Interface
  6. 数据结构与算法(C++)– 图(Graph)
  7. C指针原理(29)-Ncurses-文本终端的图形
  8. 别人家的孩子!高校博士实现Nature、Science双发!
  9. 【深度学习】一文详解RNN及股票预测实战(Python)!
  10. 【经验】新人学习写程序的第一道坎