Logback perdendo minhas mensagens de log para o arquivo

Eu escrevi um programa de teste para verificar as melhorias de desempenho do logback sobre log4j. Mas, para minha surpresa, me deparei com esse problema estranho. Eu estou escrevendo cerca de 200k mensagens de log em um loop para um arquivo usando seus assinantes Async e arquivo. Mas, toda vez, ele registra apenas cerca de 140k ou mais mensagens e pára depois disso. Apenas imprime minha última declaração de log indicando que ele escreveu tudo no buffer e o programa termina. Se eu apenas executar o mesmo programa com o Log4j, posso ver todas as 200k mensagens no arquivo de log. Existe alguma diferença arquitetural fundamental que faz isso acontecer? Existe alguma maneira de evitar isso? Estamos pensando em mudar de log4j para logback e agora isso está me fazendo repensar.

Esta é minha configuração de logback:

<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>

Este é o meu código ------------------

      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);
        }
    }