В файле logback-spring.xml есть шаблон, который я не хочу выводить, если значение отсутствует.

Вопрос или проблема

У меня есть файл logback-spring.xml с шаблоном ниже

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss} [%thread] %level %logger{35}  [%X{dd.trace_id}, %X{dd.span_id}] - %msg%n
            </Pattern>
        </encoder>

В логах он отображается правильно с [<trace_id>, <span_id>], но когда некоторые записи логов не имеют значений trace id, так как это не отслеживаемый запрос, он отображает синтаксис с пустым значением [,]. В этом сценарии я хочу напечатать все, исключив [,] из строки.

Спасибо.

Ответ или решение

Чтобы решить проблему с выводом пустых значений для trace_id и span_id в файле конфигурации logback-spring.xml, мы можем использовать условную логику в паттерне.

К сожалению, стандартный логгер Logback не поддерживает условные операции напрямую внутри паттерна. Однако вы можете достичь желаемого результата, используя MDC (Mapped Diagnostic Context) и подход с формированием сообщения логирования.

Вот два подхода, которые могут помочь в этой ситуации:

1. Использование подготовки строки

Вы можете подготовить строку с помощью Java-кода перед вызовом логирования. Убедитесь, что вы проверяете наличие значений в MDC и формируете сообщение соответственно. Например:

String traceId = MDC.get("dd.trace_id");
String spanId = MDC.get("dd.span_id");
String logMessage = String.format("Some log message with trace %s and span %s", 
    traceId != null ? traceId : "not available", 
    spanId != null ? spanId : "not available"
);
logger.info(logMessage);

2. Фильтрация на уровне паттерна (если это возможно в новой версии)

Если вы используете более новую версию Logback, можно рассмотреть возможность использования компонента Conditional или Pattern с null-проверкой:

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <Pattern>
        %d{yyyy-MM-dd HH:mm:ss} [%thread] %level %logger{35} 
        [%X{dd.trace_id} %X{dd.span_id}] - %msg%n
    </Pattern>
</encoder>

В этом случае, если trace_id или span_id не существуют в MDC, вы увидите просто пробел в квадратных скобках, что все же лучше, чем пустые скобки. Однако данный подход зависит от вашей версии Logback и может потребовать дополнительных проверок.

3. Пользовательский класс для записи логов

Если вам нужно больше контроля, вы можете реализовать свой собственный класс-логгер, который форматирует сообщение в соответствии с вашими требованиями.

Пример кастомного логгера

Вы можете создать свою реализацию Appender в Logback, которая будет обрабатывать форматирование.

public class CustomAppender extendsAppender<ILoggingEvent> {
    @Override
    protected void append(ILoggingEvent event) {
        String traceId = event.getMDCPropertyMap().get("dd.trace_id");
        String spanId = event.getMDCPropertyMap().get("dd.span_id");

        String traceInfo = "";
        if (traceId != null || spanId != null) {
            traceInfo = "[" + (traceId != null ? traceId : "") + ", " + (spanId != null ? spanId : "") + "]";
        }

        // Учитывайте нужный формат вывода
        System.out.println(event.getTimeStamp() + " " + event.getThreadName() + " " + event.getLevel() + " "
                + event.getLoggerName() + " " + traceInfo + " - " + event.getMessage());
    }
}

В файле конфигурации logback-spring.xml необходимо будет добавить ваш пользовательский аппендер.

Заключение

Решение данной проблемы требует некоторого программирования на стороне приложения. Вам нужно обрабатывать лог-сообщения прежде, чем они будут выведены, либо использовать дополнительные инструменты, чтобы настроить формат вывода. Важно выбрать решение, которое наилучшим образом соответствует архитектуре вашего приложения.

Оцените материал
Добавить комментарий

Капча загружается...