通过Logback登录到App Engine request_log

问题描述 投票:1回答:1

我已经使用App Engine标准环境-Java 11在Ninja Framework上构建了一个应用程序,并使用了Ninja随附的注入的Logger,即Apache Logback。通常,此日志记录到实例的stdout,因此我的所有消息均以每行一行的格式发送,并以stdout日志通道显示,这在尝试跟踪生产中的错误时不方便。

[是Google文档中使用Logback [1]登录到Stackdriver的指南,但我没有尝试过:日志现在以application.log结尾,它仍然是一个单独的通道,并且request_log通道为空。我尝试通过将projects/dive-site-overwatch/logs/appengine.googleapis.com%2Frequest_log作为<log>logback.xml元素来更改建议的配置,由于URL编码的固相线中的“格式无效”,导致所有请求均失败。相反,按原样添加固相线是非法字符,因此会导致异常。

我当前部署的当前Logback配置如下(您可以说我的构想已耗尽...):

<configuration> <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /> <appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="tech.provingground.dive_overwatch.etc.logging.layouts.StackdriverLayout"> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg</pattern> </layout> </encoder> </appender> <appender name = "CLOUD" class = "com.google.cloud.logging.logback.LoggingAppender"> <log>application.log</log> <!-- Optional : default java.log --> <flushLevel>WARN</flushLevel> <!-- Optional : default ERROR --> <enhancer>tech.provingground.dive_overwatch.etc.logging.enhancers.TestEnhancer</enhancer> <encoder> <layout class="tech.provingground.dive_overwatch.etc.logging.layouts.StackdriverLayout"> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg</pattern> </layout> </encoder> </appender> <root level = "info"> <appender-ref ref = "CLOUD" /> <!-- <appender-ref ref = "STDOUT" />--> </root> </configuration>

查看应用程序中的标准,我可以看到许多日志行指向来自Stackdriver的拒绝请求:

java.lang.RuntimeException: java.util.concurrent.TimeoutException: Waited 6 seconds for com.google.common.util.concurrent.CollectionFuture$ListFuture@77fbc3ba[status=PENDING, info=[futures=[[com.google.api.core.ApiFutureToListenableFuture@772ddfb8, com.google.api.core.ApiFutureToListenableFuture@7d905614, com.google.api.core.ApiFutureToListenableFuture@7396512d, com.google.api.core.ApiFutureToListenableFuture@5ad9baf6]]]] at com.google.cloud.logging.LoggingImpl.flush(LoggingImpl.java:581) at com.google.cloud.logging.LoggingImpl.write(LoggingImpl.java:562) at com.google.cloud.logging.logback.LoggingAppender.append(LoggingAppender.java:215) at com.google.cloud.logging.logback.LoggingAppender.append(LoggingAppender.java:70) at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:84) [...]

如果是身份验证错误,我可以理解403或类似的状态码,但是标准环境应该提供服务帐户,并自动授予

Logs Writer

角色。我有点迷住了。有什么方法可以将我的应用程序日志和其余请求日志放在常规request_log中?


[1] https://cloud.google.com/logging/docs/setup/java#logback_appender_for
java google-app-engine logback java-11 google-cloud-logging
1个回答
0
投票
您应该检出此example并通过logback执行JSON记录!关键元素是它包含跟踪ID,以便消息与请求日志相关。

来自示例:

// Build structured log messages as an object. Object globalLogFields = null; // Add log correlation to nest all log messages beneath request log in Log Viewer. String traceHeader = req.headers("x-cloud-trace-context"); if (traceHeader != null && project != null) { String trace = traceHeader.split("/")[0]; globalLogFields = kv( "logging.googleapis.com/trace", String.format("projects/%s/traces/%s", project, trace)); } // Create a structured log entry using key value pairs. logger.error( "This is the default display field.", kv("component", "arbitrary-property"), kv("severity", "NOTICE"), globalLogFields);

© www.soinside.com 2019 - 2024. All rights reserved.