Zaloguj się, tracąc moje dzienniki do pliku

Napisałem program testowy, aby zweryfikować poprawę wydajności logowania w log4j. Ale ku mojemu zaskoczeniu wpadłem na ten dziwny problem. Piszę kilka komunikatów dziennika 200k w pętli do pliku, używając ich asynchronicznych i dołączanych plików. Ale za każdym razem rejestruje tylko około 140 tysięcy wiadomości i zatrzymuje się po tym. Po prostu wypisuje moje ostatnie polecenie dziennika, wskazując, że zapisał wszystko w buforze i program się kończy. Jeśli po prostu uruchomię ten sam program z Log4j, mogę zobaczyć wszystkie 200k wiadomości w pliku dziennika. Czy istnieją jakieś zasadnicze różnice architektoniczne, które to powodują? Czy i tak chcesz tego uniknąć? Myślimy, że przełączenie z log4j na logback i teraz sprawia, że ​​myślę o tym ponownie.

To jest moja konfiguracja logowania:

<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logback.log</file>
<encoder>
  <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
</encoder>
 </appender>

<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="FILE" />
</appender>

<root level="info">
    <appender-ref ref="ASYNC" />
</root>
 </configuration>

To jest mój kod ------------------

      public static void main(String[] args) throws InterruptedException {
        org.slf4j.Logger logbackLogger = LoggerFactory
                .getLogger(LogbackTest.class);

        List<Integer> runs = Arrays.asList(1000, 5000, 50000, 200000);
        ArrayList<Long> logbackRuntimes = new ArrayList<>(4);

        for (int run = 0; run < runs.size(); run++) {
            logbackLogger.info("------------------------>Starting run: "
                    + (run + 1));
            // logback test
            long stTime = System.nanoTime();
            int i = 0;
            for (i = 1; i <= runs.get(run); i++) {
                Thread.sleep(1);
                logbackLogger
                .info("This is a Logback test log, run: {},     iter: {}",
                                run, i);
            }
            logbackRuntimes.add(System.nanoTime() - stTime);
            logbackLogger.info("logback run - " + (run + 1) + " " + i);
        }
        Thread.sleep(5000);
        // print results
        logbackLogger.info("Run times:");
        logbackLogger
            .info("Run\tNoOfMessages\tLog4j Time(ms)\tLogback Time(ms)");
        for (int run = 0; run < runs.size(); run++) {
            logbackLogger.info((run + 1) + "\t" + runs.get(run) + "\t"
                    + logbackRuntimes.get(run) / 10e6d);
        }
    }

questionAnswers(1)

yourAnswerToTheQuestion