我已经使用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