首页 > 解决方案 > 分配给错误请求日志的 Google AppEngine 应用程序日志

问题描述

当我查看我的 GAE 项目的 Google 日志查看器中的日志时,我发现我自己在代码中编写的日志经常被分配给错误的请求。大多数情况下,日志在生成日志条目的请求之后直接分配给请求。
由于GAE中每个应用程序日志的根都必须是一个请求,这意味着错误的请求有时会被标记为错误,因为之前的另一个请求产生了错误,但之后的日志以某种方式分配给了请求。

我真的没有做任何特别的事情,我使用 Ktor 作为我的 servlet,并有一个拦截器,当在返回状态 500 之前发生异常时创建一个日志。
我通过 SLF4J 使用 Java 日志记录和谷歌云日志记录处理程序,但在此之前我使用通过 SLf4J 进行 logback 并遇到了同样的问题。

日志本身的内容也是正确的,请求的返回状态,日志条目的级别,消息,一切都ok。

我认为这可能是因为我在单个请求期间使用了 kotlin 并切换了协程上下文,但在某些情况下,我写日志的位置和发送响应的位置正好相邻,所以我不确定是否kotlin 与它有任何关系。

我的日志记录属性:

# To use this configuration, add to system properties : -Djava.util.logging.config.file="/path/to/file"
#
.level = INFO

# it is recommended that io.grpc and sun.net logging level is kept at INFO level,
# as both these packages are used by Stackdriver internals and can result in verbose / initialization problems.
io.grpc.netty.level=INFO
sun.net.level=INFO

handlers=com.google.cloud.logging.LoggingHandler
# default : java.log
com.google.cloud.logging.LoggingHandler.log=custom_log

# default : INFO
com.google.cloud.logging.LoggingHandler.level=INFO

# default : ERROR
com.google.cloud.logging.LoggingHandler.flushLevel=WARNING

# default : auto-detected, fallback "global"
#com.google.cloud.logging.LoggingHandler.resourceType=container

# custom formatter
com.google.cloud.logging.LoggingHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$-6s %2$s %5$s%6$s%n

#optional enhancers (to add additional fields, labels)
#com.google.cloud.logging.LoggingHandler.enhancers=com.example.logging.jul.enhancers.ExampleEnhancer

我的日志相关依赖项:

  implementation "org.slf4j:slf4j-jdk14:1.7.30"
  implementation "com.google.cloud:google-cloud-logging:1.100.0"

一个示例日志调用:

exception<Throwable> { e ->
      logger().error("Error", e)
      call.respondText(e.message ?: "", ContentType.Text.Plain, HttpStatusCode.InternalServerError)
    }

logger()

import org.slf4j.Logger
import org.slf4j.LoggerFactory

inline fun <reified T : Any> T.logger(): Logger = LoggerFactory.getLogger(T::class.java)

编辑:
谷歌云中的日志示例。第一个请求具有查询参数GAID=cdda802e-fb9c-47ad-0794d394c913,但正如您所见,该请求的错误日志在下面的日志中,标记为红色。

日志查看器示例

标签: google-app-enginekotlinlogging

解决方案


推荐阅读