我正在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
记录器在每个类中的初始化为:
private static final java.util.logging.Logger LOG = java.util.logging.Logger.getLogger(MyClass.class.getName());
然后将日志记录API用作: LOG.info(“我的消息”);
我不明白为什么语句的记录方式有所不同并且不再分组,但是它必须具有Spring Boot处理日志的方式?
答案 0 :(得分:4)
自从最近的运行时以来,AppEngine
的行为正与基于容器的方法越来越融合,与其他新产品(例如Cloud Run)一样,越来越“开放”。
这正在改变我们使用GAE
进行开发的方式,特定的旧式库不可用(SearchAPI ...),并且也在改变日志的管理方式。
我们可以在新的java11
运行时中重现此“ 嵌套日志功能”,但我们需要自己进行管理。
如official docs所述:
在“日志查看器”中,可以将与同一跟踪相关的日志条目 以“亲子”格式查看。
这意味着,如果我们检索在请求的trace
HTTP标头内收到的X-Cloud-Trace-Context
标识符,则可以使用它通过将其作为{{ 1}}标识符属性。
这可以通过使用Stackdriver Logging Client libraries
完成幸运的是,Spring Cloud GCP可以使我们的生活更轻松。
您可以找到实现它的sample project。请注意,这是一个LogEntry
的示例,但它在trace
运行时中可以正常工作。
它使用Logback。
在AppEngine Flexible
上的Spring Boot项目中,要执行的步骤如下:
Standard
依赖项: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
内启用Spring GCP日志记录功能:<?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>
src/main/resources/application.properties
对于spring.cloud.gcp.logging.enabled=true
,结果将在@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 !");
}
}
查看器中显示: