Log4j журнал потерян (не распечатывается на консоль) после завершения основного потока - PullRequest
2 голосов
/ 19 марта 2020

Я использую 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>

Мои вопросы:

  1. Является ли log4j logger потоком для обоих sync / asyn c? (Если да, могу ли я установить для него нить не-демона?)

  2. Как подождать, пока мой основной поток ждет, когда все журналы успешно распечатаны на консоль?

Спасибо за помощь!

...