容器打印日志到控制台阻塞的排障
原文
今日生产环境发现有些容器停止响应了,但是容器没有死,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后问题解决。
容器打印日志到控制台阻塞的排障相关推荐
- log日志:打印日志到控制台、文件、日志文件分区、打印错误日志到文件
springboot默认会加载classpath:logback-spring.xml文件 如果需要自定义文件名称,在application.properties中配置logging.config 选 ...
- python打印日志(控制台内容输出)
你是否遇到过这样几个问题: 1.获取控制台打印的内容,并且想要保存下来 2.代码本来运行的好好的,但是由于新增内容,出现bug,加入了异常处理(try...),把不满足条件的先过滤掉.这时需要查看过滤 ...
- linux启用日志记录功能,Linux下启用Open vSwitch的日志功能以便调试和排障
问题 我试着为我的Open vSwitch部署排障,鉴于此,我想要检查它的由内建日志机制生成的调试信息.我怎样才能启用Open vSwitch的日志功能,并且修改它的日志等级(如,修改成INFO/DE ...
- idea 控制台 彩色打印日志
idea 控制台 彩色打印日志 idea 控制台 彩色打印日志 IDEA右上角:Edit Configurations,点击,找到VM options,填入-Dspring.output.ansi.e ...
- slf4j没有在linux中生成日志,logback+SLF4J 没打印日志
logback+SLF4J 没打印日志 为什么?启动时正常,但调用logger.info没打印日志,控制台和文件都没有输出. jar: logback-ext-spring-0.1.3-SNAPSHO ...
- springboot的log4j2日志不打印,且控制台不输出!!!
不打印日志,并且连简单的nullporint等异常都不输出!!! 不报错 问题出在哪呢? 碰到这种问题 . 检查日志的配置文件 具体配置 ,可自行百度...... 情况1: 在配置都正确 ...
- slf4j+log4j打印日志,控制台无日志输出
slf4j+log4j 实现日志打印 项目场景: 今天看以前的项目,运行起来报错,项目日志对于项目是很重要的,但是控制台没有打印出来日志,运行起来报错的问题先放一放,先把日志的问题解决了,我项目中有l ...
- IDEA控制台为什么不打印日志
有的时候会发现IDEA的控制台不打印日志,有时候打印,这是为什么呢. 我遇到的一种原因是:其实打印了日志,你没注意而已. 原因 如果日志太长,则会缩成 <1 internal call> ...
- springmvc使用log4j2的配置,以及解决controller日志只有控制台打印日志,不生成本项目文件夹下
文章目录 1.引包 2. log4j2.xml的配置 3.配置文件中的一些说明 springmvc使用log4j2的配置,以及只有控制台打印日志,不生成文件的解决方式,mvc使用log4j2时会出现在 ...
最新文章
- oracle安装清单过不去,oracle 11g(二)安装过程
- oracle 12C(12.2.0.1)安装-plm系统(一)
- hdu 1016 Prime Ring Problem(DFS)
- Spring Boot 配置加载顺序详解
- 百度兴趣点下载工具设计和实现
- mybatis学习(50):嵌套查询
- B样条曲线介绍和实现(等值线平滑)
- 数据分析师的前世今生
- Atitit.加密算法ati Aes的框架设计
- 零基础入门数据挖掘,看完这份详细的学习指南就够了!(附资料)
- 一篇彻底搞懂-->shell脚本
- Android开发 应用软件更新通用方式--强制/非强制/远程控制/浏览器 更新
- Windows 错误码整理
- c语言浮点数乘法算法,单精度浮点数乘法的实现
- 携程显示连接不到服务器,携程:网络故障由员工错误操作导致
- 气体传感器的市场状况及主要厂商
- TIDB 性能测试(TIUP-TPCC)
- 【机器人】工业机器人如何赋能3C制造升级?工业机器人的16项重要应用;工业机器人的11个知识问答,“业内人”必看!
- java怎么实现按键音_实例:使用Javascript制作声音按钮
- HorizontalScrollview+recycleview实现横向滑动