Spring Boot Logging и Google Log Platform Viewer - PullRequest
3 голосов
/ 07 февраля 2020

Я запускаю приложение Spring Boot в облачной платформе Google и просматриваю файлы журналов, просматривая средство просмотра журналов Google Platform. Перед использованием Spring Boot и простым использованием простых сервлетов записи журналирования будут отображаться как:

Logs are grouped and show the blue information icon

Каждый запрос будет сгруппирован, и вся информация журналирования для этот запрос можно увидеть, расширив строку. Однако при использовании Spring Boot запросы больше не группируются, а записи журнала просто отображаются построчно. Когда есть несколько запросов, записи журнала становятся очень запутанными в результате, потому что невозможно просмотреть их сгруппированным способом. У меня есть настройки logging.properties таким же образом:

.level = INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format = [%1$tc] %4$s: %2$s - %5$s %6$s%n

Logger инициализируется в каждом классе как:

private static final java.util.logging.Logger LOG = java.util.logging.Logger.getLogger(MyClass.class.getName());

И затем API ведения журнала используется как: LOG. info ("Мое сообщение");

Я не понимаю, почему операторы регистрируются по-разному и больше не группируются, но это должно быть связано с тем, как Spring Boot обрабатывает ведение журнала?

1 Ответ

4 голосов
/ 12 февраля 2020

С недавних времен выполнения AppEngine развивается с поведением, которое все более и более сходится с подходом, основанным на контейнерах, все более и более "открытым" как новые другие продукты (например, Cloud Run).

Это немного меняет то, как мы разрабатываем с GAE, определенные c устаревшие библиотеки недоступны (SearchAPI ...), и это также меняет способ управления журналами.

Мы можем воспроизвести эту " функцию вложенного журнала " с новой java11 средой выполнения, но нам нужно управлять ею самостоятельно.

Как Официальные документы упомянуто:

В средстве просмотра журналов записи журнала, коррелированные с одной и той же трассировкой, можно просматривать в формате «родитель-потомок».

Это означает, что если мы получить идентификатор trace, полученный внутри заголовка HTTP X-Cloud-Trace-Context нашего запроса, затем мы можем использовать его для добавления нового LogEntry, передав его в качестве атрибута идентификатора trace.

Это можно сделать с помощью клиентских библиотек ведения журналов Stackdriver

с Spring GCP

К счастью, Spring Cloud GCP призван сделать нашу жизнь проще.

Вы можете найти пример проекта , который его реализует. Будьте осторожны, это пример AppEngine Flexible, но он будет хорошо работать с Standard временем выполнения. Он использует Logback .

Из рабочего проекта Spring Boot на GAE Java11 необходимо выполнить следующие шаги:

  • Добавить spring-cloud-gcp-starter-logging зависимость:
<!-- Starter for Stackriver Logging -->   
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-gcp-starter-logging</artifactId>
   <version>1.2.1.RELEASE</version>
</dependency>

  • Добавление logback-spring.xml внутри src/main/resources папки:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/cloud/gcp/autoconfigure/logging/logback-appender.xml" />
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />

    <root level="INFO">
        <!-- If running in GCP, remove the CONSOLE appender otherwise logs will be duplicated. -->
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="STACKDRIVER" />
    </root>
</configuration>
  • Включение функции ведения журнала Spring GCP внутри src/main/resources/application.properties:
spring.cloud.gcp.logging.enabled=true
  • И используйте LOGGER внутри вашего кода:
@SpringBootApplication
@RestController
public class DemoApplication {
    private static final Log LOGGER = LogFactory.getLog(DemoApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @GetMapping()
    public SomeData get() {
        LOGGER.info("My info message");
        LOGGER.warn("My warning message");
        LOGGER.error("My error message");

        return new SomeData("Hello from Spring boot !");
    }
}

Результат будет в Stackdriver Logging средстве просмотра, для appengine.googleapis.com/request_log:

Stackdriver Logging Viewer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...