public org.slf4j.Logger logger() {
        if (this.logger == null) {
            LoggerContext loggerContext = new LoggerContext();
            LogbackMDCAdapter mdcAdapter = new LogbackMDCAdapter();

            loggerContext.setMDCAdapter(mdcAdapter);
            loggerContext.start();

            this.logger = loggerContext.getLogger(this.loggerName);

            // unit test don't need the logqueue
            if (this.logQueue != null && this.logEntry != null) {
                ContextAppender contextAppender = new ContextAppender(this, this.logger, this.logQueue, this.logEntry);
                contextAppender.setContext(loggerContext);
                contextAppender.start();

                this.logger.addAppender(contextAppender);

                MDC.setContextMap(this.logEntry.toMap());
            }

            ForwardAppender forwardAppender = new ForwardAppender(this, this.logger);
            forwardAppender.setContext(loggerContext);
            forwardAppender.start();
            this.logger.addAppender(forwardAppender);

            this.logger.setLevel(this.loglevel);
            this.logger.setAdditive(true);
        }

        return this.logger;
    }
@Test
    void emptyLogMessage() {
        List<LogEntry> logs = new CopyOnWriteArrayList<>();
        List<LogEntry> matchingLog;
        Flux<LogEntry> receive = TestsUtils.receive(logQueue, either -> logs.add(either.getLeft()));

        Flow flow = TestsUtils.mockFlow();
        Execution execution = TestsUtils.mockExecution(flow, Map.of());

        RunContextLogger runContextLogger = new RunContextLogger(
            logQueue,
            LogEntry.of(execution),
            Level.TRACE
        );

        Logger logger = runContextLogger.logger();
        logger.info("");

        matchingLog = TestsUtils.awaitLogs(logs, 1);
        receive.blockLast();
        assertThat(matchingLog.stream().findFirst().orElseThrow().getMessage(), is(emptyString()));
    }