Spring Boot 日志记录和 Google Cloud Platform 日志查看器

Ada*_*ton 8 java.util.logging google-cloud-platform stackdriver

我正在 Google Cloud Platform 中运行 Spring Boot 应用程序,并通过 Google Platform Logs Viewer 查看日志文件。在使用 Spring Boot 并仅使用简单的 servlet 之前,日志记录条目将显示为:

日志已分组并显示蓝色信息图标

每个请求都会被分组,并且可以通过展开行来查看该请求的所有日志记录信息。然而,当使用 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
Run Code Online (Sandbox Code Playgroud)

记录器在每个类中初始化为:

private static final java.util.logging.Logger LOG = java.util.logging.Logger.getLogger(MyClass.class.getName());
Run Code Online (Sandbox Code Playgroud)

然后日志记录 API 用作: LOG.info("My Message");

我不明白为什么这些语句以不同的方式记录并且不再分组,但它必须与 Spring Boot 处理日志记录的方式有某种关系?

Thi*_*lvo 7

自最近的运行时以来,AppEngine它的行为越来越与基于容器的方法融合,与其他新产品(例如 Cloud Run)更加“开放”。

这稍微改变了我们开发的方式GAE,特定的遗留库不可用(SearchAPI ...),并且它也改变了日志的管理方式。

我们可以用新的运行时重现这个“嵌套日志功能java11,但我们需要自己管理它。

正如官方文档提到的:

在日志查看器中,可以以“父子”格式查看由同一跟踪关联的日志条目。

这意味着,如果我们检索请求的 HTTP 标头trace内收到的标识符X-Cloud-Trace-Context,则可以通过将LogEntry其作为标识符属性传递来使用它来添加新标识符trace

这可以通过使用Stackdriver Logging Client 库来完成

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

Run Code Online (Sandbox Code Playgroud)
  • 添加一个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>
Run Code Online (Sandbox Code Playgroud)
  • 在内部启用 Spring GCP 日志记录功能src/main/resources/application.properties
spring.cloud.gcp.logging.enabled=true
Run Code Online (Sandbox Code Playgroud)
  • 并在代码中使用 LOGGER:
spring.cloud.gcp.logging.enabled=true
Run Code Online (Sandbox Code Playgroud)

结果将显示在Stackdriver Logging查看器中,其中appengine.googleapis.com/request_log

Stackdriver 日志查看器