我正在Google平台中运行一个Spring应用程序,并查看日志文件,查看。在使用Spring之前,只使用简单servlet,日志记录条目将显示为:

将对每个请求进行分组,并通过展开行来查看该请求的所有日志信息。但是,当使用Spring时,请求不再分组,日志条目只是逐行显示。当有多个请求时,日志条目会变得非常混乱,因为不可能以分组的方式查看它们。我的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%nLogger在每个类中初始化如下:
private static final java.util.logging.Logger LOG = java.util.logging.Logger.getLogger(MyClass.class.getName());然后将日志API用作:LOG.info(“Message");
我不明白为什么这些语句被以不同的方式记录,不再分组,但是它必须与Spring处理日志的方式有关吗?
发布于 2020-02-12 14:56:48
自最近的运行时以来,AppEngine的行为越来越多地与基于容器的方法趋同,更多地“打开”为新的其他产品(例如Cloud )。
这有点改变了我们使用GAE开发的方式,特定的遗留库是不可用的(SearchAPI.),它也在改变日志的管理方式。
我们可以用新的运行时再现这个“嵌套日志特性”,但是我们需要自己管理它。
正如官方文件所提到的:
在日志查看器中,可以以“父-子”格式查看由相同跟踪关联的日志条目。
这意味着,如果我们检索在请求的trace HTTP头中接收到的X-Cloud-Trace-Context标识符,那么我们可以使用它来添加一个新的LogEntry,方法是将它作为trace标识符属性传递。
这可以通过使用堆栈驱动程序记录客户端库来完成
使用Spring
幸运的是,春云GCP是为了让我们的生活更轻松。
您可以找到一个实现它的样本工程。小心点,这是一个AppEngine Flexible示例,但它在Standard运行时可以很好地工作。它使用Logback。
在GAE Java11上运行的Spring项目中,下面的步骤如下:
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>src/main/resources/application.properties中启用Spring日志功能: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 !");
}
}结果将出现在Stackdriver Logging查看器中,用于appengine.googleapis.com/request_log:

https://stackoverflow.com/questions/60115784
复制相似问题