Я использую Spring Boot с Log4j для массивных параллельных вычислений.
Я использую consoleappender, чтобы показать сообщение журнала для sysout.
Я не устанавливаю asyn c log4j , поэтому LogManager.shutdown не разрешен в этом случае.
После успешного завершения программы часть журнала была потеряна (не отображается в консоли), ниже приведен фрагмент кода / конфигурации.
public class TestClass() {
Logger LOGGER = LogManager.getLogger(TestClass.class);
main() {
ExecutorService executorService = Executors.newFixedThreadPool(20);
for(large amount) {
executorService.submit(() -> {
LOGGER.info(".....") // lots of log message inside each task
});
}
executorService.shutdown();
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
// Thread.sleep(10000) // If main thread sleep for a few seconds, all the log will show in the console.
}
}
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" monitorInterval="5" package="...">
<Properties>
<Property name="application.name">...</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy/MM/dd@HH:mm:ss.SSS} [%t] %-5level %logger{36} ${application.name} %X{X-B3-TraceId} - %msg%n" charset="UTF-8" />
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console" />
</Root>
<Logger name="..." level="DEBUG" additivity="false">
<AppenderRef ref="Console" />
</Logger>
</Loggers>
</Configuration>
Мои вопросы:
Является ли log4j logger потоком для обоих sync / asyn c? (Если да, могу ли я установить для него нить не-демона?)
Как подождать, пока мой основной поток ждет, когда все журналы успешно распечатаны на консоль?
Спасибо за помощь!