ENV:
Пружинный ботинок 1.5.9. ВЫПУСК
spring-boot-starter-log4j2 (Is Log4j 2.7 версия)
Размер всей выходной информации составляет 9 КБ, включая весь вывод пружинной загрузки
А это моя конфигурация log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<Property name="pid">???</Property>
<Property name="logPattern">%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:pid}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx</Property>
<Property name="fileLogPattern">%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n\n</Property>
<Property name="logPath">/data/server/tomcat/logs/bbPurchaseAgency</Property>
<!-- for SizeBasedTriggeringPolicy, this is the problem, but I need file split function -->
<Property name="fileSplitSize">2KB</Property>
<Property name="fileSplitTime">1</Property>
<Property name="maxSurviveTime">30d</Property>
</Properties>
<Appenders>
<Console name="developLog" target="SYSTEM_OUT" follow="true">
<PatternLayout charset="${encoding}" pattern="${logPattern}"/>
<ThresholdFilter level="info" onMatch="accept" onMismatch="deny"/>
</Console>
<RollingFile name="infoFile" fileName="${logPath}/bbPurchaseAgency_info.log"
filePattern="${logPath}/bbPurchaseAgency_info_%d{yyyy-MM-dd}-%i.log">
<PatternLayout charset="${encoding}" pattern="${fileLogPattern}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="${fileSplitTime}"/>
<SizeBasedTriggeringPolicy size="${fileSplitSize}"/>
</Policies>
<Filters>
<!-- this filter will be print all information whatever level it is -->
<ThresholdFilter level="info" onMatch="accept" onMismatch="deny"/>
<ThresholdFilter level="error" onMatch="deny" onMismatch="neutral"/>
<ThresholdFilter level="warn" onMatch="deny" onMismatch="neutral"/>
</Filters>
<DefaultRolloverStrategy>
<Delete basePath="${logPath}" maxDepth="1">
<IfFileName glob="bbPurchaseAgency_info_%d{yyyy-MM-dd}-%i.log" />
<IfLastModified age="${maxSurviveTime}"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="warnFile" fileName="${logPath}/bbPurchaseAgency_warn.log"
filePattern="${logPath}/bbPurchaseAgency_warn_%d{yyyy-MM-dd}-%i.log">
<PatternLayout charset="${encoding}" pattern="${fileLogPattern}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="${fileSplitTime}"/>
<SizeBasedTriggeringPolicy size="${fileSplitSize}"/>
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="deny" onMismatch="neutral"/>
<ThresholdFilter level="warn" onMatch="accept" onMismatch="deny"/>
</Filters>
<DefaultRolloverStrategy>
<Delete basePath="${logPath}" maxDepth="1">
<IfFileName glob="bbPurchaseAgency_warn_%d{yyyy-MM-dd}-%i.log" />
<IfLastModified age="${maxSurviveTime}"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="errorFile" fileName="${logPath}/bbPurchaseAgency_error.log"
filePattern="${logPath}/bbPurchaseAgency_error_%d{yyyy-MM-dd}-%i.log">
<PatternLayout charset="${encoding}" pattern="${fileLogPattern}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="${fileSplitTime}"/>
<SizeBasedTriggeringPolicy size="${fileSplitSize}"/>
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="accept" onMismatch="deny"/>
</Filters>
<DefaultRolloverStrategy>
<Delete basePath="${logPath}" maxDepth="1">
<IfFileName glob="bbPurchaseAgency_error_%d{yyyy-MM-dd}-%i.log" />
<IfLastModified age="${maxSurviveTime}"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<AsyncLogger name="com.baibu.purchaseAgency" level="info" includeLocation="false">
<AppenderRef ref="infoFile"/>
</AsyncLogger>
<AsyncLogger name="com.baibu.purchaseAgency" level="warn" includeLocation="true">
<AppenderRef ref="warnFile"/>
</AsyncLogger>
<AsyncLogger name="com.baibu.purchaseAgency" level="error" includeLocation="true">
<AppenderRef ref="errorFile"/>
</AsyncLogger>
<Root level="info">
<AppenderRef ref="developLog"/>
<AppenderRef ref="infoFile"/>
<AppenderRef ref="warnFile"/>
<AppenderRef ref="errorFile"/>
</Root>
</Loggers>
</Configuration>
Итак, вот вопрос:
Когда я активирую пружинную загрузку и тестирую, вызывая исключение, log4j2 печатает что-то и вызывает исключение, которое я создаю, И ПОТОМ пружинная загрузка не может остановиться из-за утечки памяти в log4j2.
Это тестовый код:
@Value( "${spring.datasource.url}" )
public void checkDataSource( String url ) {
logger.warn( "warning url" );
logger.error( "error url" );
Integer.parseInt( url ); // I raise an exception when spring boot starting
}
И это информация стека:
The web application [ROOT] appears to have started a thread named [Log4j2-TF-4-1a752144-3] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:359)
java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:942)
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
java.lang.Thread.run(Thread.java:745)
И я запускаю другой тест, такой как закрытие функции разделения файлов (установите для fileSplitSize значение 512 МБ), или делаю это:
@Value( "${spring.datasource.url}" )
public void checkDataSource( String url ) {
new Thread( new Runnable() {
@Override
public void run() {
try {
Thread.sleep( 10 * 1000 );
} catch ( InterruptedException e ) {
e.printStackTrace();
}
System.exit( 0 );
}
} ).start();
}
Ничего не происходит, все хорошо, утечки памяти нет ...
Также я вижу это описание на веб-сайте log4j2 (http://logging.apache.org/log4j/2.x/manual/webapp.html):
Во избежание проблем отключение Log4j будет автоматически отключено, если в него включен jar-файл log4j.
Я сделал это, но не работает.
В gitHub Log4j2 нет проблем, и в Интернете мало информации об утечке памяти log4j2. Может, кто-нибудь подскажет, как решить эту проблему? СПАСИБО ОЧЕНЬ МНОГО!