Java 弹簧靴Log4j2螺纹堵塞
在我们的Prod环境中,应用程序突然被卡住,并且并没有任何请求得到处理,所以,我执行了PID的线程转储 我看到一个Log4j被其他线程锁定的对象阻塞了 共享threaddump的各个部分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
```"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
,倒计时闩锁
,信号量
等屏障
由于涉及到在
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