V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
netizenHan
V2EX  ›  Java

Java logback 日志打印卡在 writeBytes,导致程序卡死问题

  •  
  •   netizenHan · 65 天前 · 1296 次点击
    这是一个创建于 65 天前的主题,其中的信息可能已经有所发展或是发生改变。

    程序启动时有一些信息会使用 CONSOLEAPPENDER 打印信息,现在发现有一个日志,日志比较大,12 万字符,打印会卡死在 writeBytes ,然后就不动了,这次是引入了公司的一个 jacoco 覆盖率 agent ,但是看起来报错跟这个没太大关系,但是去掉就能正常启动

    堆栈信息中并没有其他线程抢占了这个锁,也从系统资源的角度去找问题,但是没有发现什么有价值的信息

    "AsyncAppender-Worker-ASYNC_CONSOLE_APPENDER_NAME" #25 daemon prio=5 os_prio=0 tid=0x00007ff4cc698000 nid=0x397 runnable [0x00007ff47475a000] 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 <0x00000006c00256d0> (a java.io.BufferedOutputStream) at java.io.PrintStream.write(PrintStream.java:480) - locked <0x00000006c00256b0> (a java.io.PrintStream) at java.io.FilterOutputStream.write(FilterOutputStream.java:97) at ch.qos.logback.core.joran.spi.ConsoleTarget$1.write(ConsoleTarget.java:37) at ch.qos.logback.core.OutputStreamAppender.writeBytes(OutputStreamAppender.java:199) at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:231) at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:102) at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:84) at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51) at ch.qos.logback.core.AsyncAppenderBase$Worker.run(AsyncAppenderBase.java:290)

    6 条回复    2024-09-23 09:21:25 +08:00
    shine1996
        1
    shine1996  
       65 天前
    文件是不是有其他进程占用呢?
    netizenHan
        2
    netizenHan  
    OP
       65 天前
    @shine1996 #1 被占用的应该是终端输出,通过 ls -l /proc/834/fd 命令查到了输出的 pipe:l-wx------ 1 root root 64 Sep 20 13:31 1 -> pipe:[3341588393]
    然后 lsof | grep 3341588393 ,有一堆信息,dockerini ,bash ,还有自己的 834 java 进程,看起来都比较常规
    sagaxu
        3
    sagaxu  
       65 天前
    你先把 stdout 和 stderr 重定向到文件试试
    0xD800
        4
    0xD800  
       64 天前 via Android
    windows 下的程序? stdout 可能被阻塞了,右键一下控制台
    netizenHan
        5
    netizenHan  
    OP
       62 天前
    @sagaxu #3 @0xD800 #4
    是 Linux 下 docker 启动的,目前看起来是 stdout 被阻塞了,搜到的相关资料说是 docker 是从标准输出读数据的,我的程序通过 nohup 启动的,然后输出没有定向到 stdout
    但是还有几个问题我没太明白
    1. 别的项目也是一样的配置,但是不影响,如果 stdout 会被阻塞,日志如果很小的话,时间长了一样会把 stdout 堆满
    netizenHan
        6
    netizenHan  
    OP
       62 天前
    @netizenHan #5
    2. 如果不用 nohup 启动,日志直接正常打印,还是一样阻塞
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2955 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:10 · PVG 21:10 · LAX 05:10 · JFK 08:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.