Структурированные журналы Stackdriver — добавление MDC в журналы

#spring-boot #google-cloud-platform #google-cloud-stackdriver #spring-cloud-gcp

#весенняя загрузка #google-облачная платформа #google-облако-stackdriver #spring-cloud-gcp

Вопрос:

Добавлен MDC в журналы, чтобы иметь возможность отслеживать конкретные журналы ошибок на панели управления Stackdriver и консоли ведения журнала. Текущая реализация отлично работает на локальном компьютере, но в облаке это не так — просто не включайте мой MDC в запись журнала. Проблема в том, что я вообще не могу понять, в чем может быть проблема.

Вывод локальных журналов (содержит «ContextKey»: «someValue»):

 {"traceId":"615b35dc7f639027","spanId":"615b35dc7f639027","spanExportable":"false","contextKey":"someValue","timestampSeconds":1552311117,"timestampNanos":665000000,"severity":"ERROR","thread":"reactor-http-nio-3","logger":"com.example.someservice.controller.MyController", ...}
  

Журнал контейнера Kubernetes той же службы (в этой записи журнала нет «ContextKey»: «someValue»):

 {"traceId":"8d7287fa0ebdacfce9b88097e290ecbf","spanId":"96967afbe05dbf0e","spanExportable":"false","X-B3-ParentSpanId":"224dcb9869488858","parentId":"224dcb9869488858","timestampSeconds":1552312549,"timestampNanos":752000000,"severity":"ERROR","thread":"reactor-http-epoll-2","logger":"com.example.someservice.controller.MyController","message":"Something went wrong","context":"default","logging.googleapis.com/trace":"projects/my-project/traces/8d7287fa0ebdacfce9b88097e290ecbf","logging.googleapis.com/spanId":"96967afbe05dbf0e"}
  

Мой logback.xml:

 <configuration>

    <appender name="CONSOLE_JSON" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.springframework.cloud.gcp.autoconfigure.logging.StackdriverJsonLayout">
                <projectId>${projectId}</projectId>
            </layout>
        </encoder>
    </appender>

    <springProfile name="local,dev,test">
        <root level="INFO">
            <appender-ref ref="CONSOLE_JSON"/>
        </root>
    </springProfile>
</configuration>
  

Контроллер, который запускает создание журнала с определенным MDC:

 @RestController
@RequestMapping("v1/my-way")
@Slf4j
public class MyController {

    @GetMapping
    public void read() {
        MDC.put("contextKey", "someValue");
        log.error("Something went wrong");
        MDC.remove("contextKey")
    }

}
  

Ответ №1:

Ваши поля MDC должны быть доступны на узле «метки» объекта журнала. Вы там проверяли?

Также в консоли Google в Logs Viewer неплохо настроить отображение полей MDC в записях журналов. Для этого установите «метки.YouCustomMDCField: в настройках просмотра -> Изменить пользовательские поля (в правом верхнем углу экрана)

Обновление: Однако вы используете другой подход, чем я, для ведения журнала в Stackdriver. Я использую

 <appender name="STACKDRIVER" class="com.google.cloud.logging.logback.LoggingAppender">
    <log>
        ${log_file_name}
    </log>
</appender>
  

и это делает свое дело (у меня тоже есть Spring).