Java 弹簧靴Log4j2螺纹堵塞

Java 弹簧靴Log4j2螺纹堵塞,java,spring-boot,log4j2,spring-boot-starter,Java,Spring Boot,Log4j2,Spring Boot Starter,在我们的Prod环境中,应用程序突然被卡住,并且并没有任何请求得到处理,所以,我执行了PID的线程转储 我看到一个Log4j被其他线程锁定的对象阻塞了 共享threaddump的各个部分 ```"http-nio-8080-exec-21025" #4910868 daemon prio=5 os_prio=0 tid=0x00007f2b3016a000 nid=0x2d87 runnable [0x00007f2b06d9e000] java.lang.Th

在我们的Prod环境中,应用程序突然被卡住,并且并没有任何请求得到处理,所以,我执行了PID的线程转储

我看到一个Log4j被其他线程锁定的对象阻塞了

共享threaddump的各个部分

    ```"http-nio-8080-exec-21025" #4910868 daemon prio=5 os_prio=0 tid=0x00007f2b3016a000 nid=0x2d87 runnable [0x00007f2b06d9e000]
   java.lang.Thread.State: RUNNABLE
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:326)
    at org.apache.logging.log4j.core.appender.OutputStreamManager.writeToDestination(OutputStreamManager.java:250)
    - eliminated <0x00000000deb28ba8> (a org.apache.logging.log4j.core.appender.rolling.RollingFileManager)
    at org.apache.logging.log4j.core.appender.FileManager.writeToDestination(FileManager.java:273)
    - eliminated <0x00000000deb28ba8> (a org.apache.logging.log4j.core.appender.rolling.RollingFileManager)
    at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.writeToDestination(RollingFileManager.java:240)
    - eliminated <0x00000000deb28ba8> (a org.apache.logging.log4j.core.appender.rolling.RollingFileManager)
    at org.apache.logging.log4j.core.appender.OutputStreamManager.flushBuffer(OutputStreamManager.java:282)
    - eliminated <0x00000000deb28ba8> (a org.apache.logging.log4j.core.appender.rolling.RollingFileManager)
    at org.apache.logging.log4j.core.appender.OutputStreamManager.flush(OutputStreamManager.java:291)
    - **locked <0x00000000deb28ba8>** (a org.apache.logging.log4j.core.appender.rolling.RollingFileManager)```

    ```"http-nio-8080-exec-20991" #4899507 daemon prio=5 os_prio=0 tid=0x00007f2b30163000 nid=0x7e98 waiting for monitor entry [0x00007f2a62dcd000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.checkRollover(RollingFileManager.java:272)
    - **waiting to lock <0x00000000deb28ba8>** (a org.apache.logging.log4j.core.appender.rolling.RollingFileManager)
    at org.apache.logging.log4j.core.appender.RollingFileAppender.append(RollingFileAppender.java:311)
    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) ```
````“http-nio-8080-exec-21025”(4910868守护程序prio=5 os_prio=0 tid=0x00007f2b3016a000 nid=0x2d87可运行[0x00007f2b06d9e000]
java.lang.Thread.State:可运行
位于java.io.FileOutputStream.writeBytes(本机方法)
在java.io.FileOutputStream.write(FileOutputStream.java:326)处
位于org.apache.logging.log4j.core.appender.OutputStreamManager.writeToDestination(OutputStreamManager.java:250)
-消除(一个org.apache.logging.log4j.core.appender.rolling.RollingFileManager)
位于org.apache.logging.log4j.core.appender.FileManager.writeToDestination(FileManager.java:273)
-消除(一个org.apache.logging.log4j.core.appender.rolling.RollingFileManager)
位于org.apache.logging.log4j.core.appender.rolling.RollingFileManager.writeToDestination(RollingFileManager.java:240)
-消除(一个org.apache.logging.log4j.core.appender.rolling.RollingFileManager)
位于org.apache.logging.log4j.core.appender.OutputStreamManager.flushBuffer(OutputStreamManager.java:282)
-消除(一个org.apache.logging.log4j.core.appender.rolling.RollingFileManager)
位于org.apache.logging.log4j.core.appender.OutputStreamManager.flush(OutputStreamManager.java:291)
-**锁定**(org.apache.logging.log4j.core.appender.rolling.RollingFileManager)```
```“http-nio-8080-exec-20991”#4899507守护进程prio=5 os_prio=0 tid=0x00007f2b0163000 nid=0x7e98等待监视器条目[0x00007f2da62dcd000]
java.lang.Thread.State:阻塞(在对象监视器上)
位于org.apache.logging.log4j.core.appender.rolling.RollingFileManager.checkRollover(RollingFileManager.java:272)
-**等待锁定**(org.apache.logging.log4j.core.appender.rolling.RollingFileManager)
位于org.apache.logging.log4j.core.appender.RollingFileAppender.append(RollingFileAppender.java:311)
位于org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
在org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
在org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)上```

[%-5level]%d{yyyy-MM-dd HH:MM:ss.SSS}[%t]%c{1}-%msg%n
```
>有人能帮我用Spring Boot Log4j2解决这个问题吗
Java-8
Spring启动版本-2.3.2.0版本
spring-boot-starter-log4j2

由于新请求未被处理且应用程序冻结,这可能表明您的应用程序遇到了死锁。死锁可能发生的最简单情况是,您有两个线程(ThreadA、ThreadB)和两个资源(R1和R2),一次只能由一个线程独占使用。这些资源可以是:

  • 数据库中的悲观锁保护数据库行不被修改
  • 监视对象保护
    同步的
    方法或
    java.util.ConCurrency
    类的对象使用的方法,如
    倒计时闩锁
    信号量
    屏障
让我们假设两个线程(ThreadA、ThreadB)都需要获得两个资源(R1和R2)才能执行某些操作。如果两个线程同时尝试执行此操作,但顺序不同,则可能会发生死锁:

  • 资源R1和R2是免费的
  • ThreadA获取的资源R1-即输入的同步方法
  • ThreadB获得的资源R2-即获得的悲观锁
  • ThreadA试图获取资源R2,但它被ThreadB占用,所以它等待 无限期,直到可以自由继续操作流程为止
  • ThreadB试图获取资源R1,但它被ThreadA占用,所以它会无限期地等待,直到可以继续操作流为止
  • 从现在起,所有其他只需要获取其中一个资源的线程也开始无限期地等待,应用程序被卡住
  • 线程转储可以帮助您找到线程等待的监视器对象。对于DB悲观锁,每个DB通常都有一些工具,可以列出获得的悲观锁和与之相关的查询


    由于涉及到在
    RollingFileManager
    等待的线程,我建议检查类中
    toString()
    方法的实现是否没有直接或间接调用某些同步方法。另外,请确保您的应用程序有足够的日志存储空间,并具有写入日志的权限-可能这个问题的根本原因更为简单。

    如果您的日志线程被阻塞很长时间,这听起来像是文件系统出了问题,即无法写入日志。检查以确保磁盘分区未满,Apache拥有所有文件操作的权限(我认为日志旋转可能需要删除权限)等。基本上,更改目录中文件的进程可能会出错。是否有许多线程都在等待执行文件系统操作的单个线程?这在log4j中非常常见,因为日志行没有缓冲。所有日志操作都必须按顺序进行,因为我们不希望文件中的行混在一起。这表明应用程序写入的日志输出超出了它所能处理的范围。我经常看到这种情况,当应用程序处理的负载比最初测试时要多。您好@markspace感谢您的回复,我将检查文件系统状况。好的@KevinBoone将检查这一点
        <Console name="Console-Appender" target="SYSTEM_OUT">
              <PatternLayout>
                <pattern>
                     [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
                </pattern>
            </PatternLayout>  
        </Console>
        <RollingFile name="RollingFile-Appender" fileName="@log4j2.path@/rbac.log" filePattern="@log4j2.path@/rbac.log.%d{yyyy-MM-dd}">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [${bundle:application:spring.application.name},%X{X-B3-TraceId},%X{X-B3-SpanId}] %c{1} - %msg%n"/>
            <Policies>
                 <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="100"/>
      </RollingFile>        
    </Appenders>
      
    <Loggers>
      <Logger name="org.springframework" level="info" additivity="false">
                <AppenderRef ref="Console-Appender"/>
            </Logger>
          <Logger name="com.pisp" level="info" additivity="false">
              <AppenderRef ref="RollingFile-Appender" level="info"/>        
          </Logger>
      <Root level="info">
              <AppenderRef ref="Console-Appender" />
              <AppenderRef ref="RollingFile-Appender" />
          </Root>
    </Loggers>```
    
    
    > Can Someone Help me fix this issue with Spring Boot Log4j2
    
    Java -8 
    Spring Boot Version - 2.3.2.RELEASE
    spring-boot-starter-log4j2