GAE应用程序的日志尾部包括应用程序的日志,而不仅仅是http请求日志

时间:2018-10-13 15:40:00

标签: java spring-boot google-app-engine gcloud google-cloud-stackdriver

将应用程序(由Spring Boot和Kotlin制成)部署到Google App Engine之后,我可以使用 $ gcloud app logs tail监视最新日志:

tail logs

但是它不显示应用程序输出的日志。 我必须使用浏览器转到StackDriver来浏览在线日志。 这不方便。

另一种方法是使用命令行通过request_log命令读取gcloud logging

gcloud logging read request_log --limit=10

但是它不支持tail模式,并且它输出了太多的有效载荷数据(例如label,requestId,zone ... blah ...)。我尝试了多种格式,但仍然输出了太多的有效载荷。

我只想查看logger.info("...")或更高级别的输出

gcloud app logs tail是否还可以通过应用程序输出日志?或通过其他任何方式在控制台中 tail (监视)应用程序的日志?

记录代码很简单(通过slf4j):

@RestController
class WebhookController {

  val logger = LoggerFactory.getLogger(javaClass)!!

  @GetMapping("/")
  fun index(req: HttpServletRequest): String {
    logger.info("header : ")
    for (headerName in req.headerNames) {
      logger.info("\t{} = {}", headerName, req.getHeader(headerName))
    }
    logger.info("params : ")
    req.parameterMap.forEach { (k, v) ->
      logger.info("\t{} = {}", k, v)
    }
    return "Hello Spring Boot Kotlin "
  }
}

环境:

logging.properties

.level = INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=INFO

appengine-web.xml

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <version>1</version>
  <threadsafe>true</threadsafe>
  <runtime>java8</runtime>
  <system-properties>
    <property name="java.util.logging.config.file" value="logging.properties"/>
  </system-properties>
</appengine-web-app>

Google Cloud SDK 220.0.0
app-engine-java 1.9.66
<kotlin.version>1.2.71</kotlin.version>
<springboot.version>2.0.5.RELEASE</springboot.version>
<spring.version>5.0.8.RELEASE</spring.version>

已更新:浏览器示例中的StackDriver: enter image description here 我只对红色圆圈部分感兴趣。但不会在gcloud app logs tail

中输出

4 个答案:

答案 0 :(得分:0)

您的应用程序日志应该进入stdout流,您可以使用--logs命令的gcloud app logs tail选项进行选择。

gcloud app logs tail --logs=stdout

请参阅:https://cloud.google.com/sdk/gcloud/reference/app/logs/tail

答案 1 :(得分:0)

尝试使用该工具的 beta 版本!

通过类似gcloud beta app logs tail --project=... --logs=stdout,stderr之类的东西,我可以从实时代码中获得预期的踪迹。

答案 2 :(得分:0)

这有点棘手,但是您可以做的是:

  1. 使用watch -n 1每秒运行一次命令(类似尾部的解决方法)
  2. 使用gcloud logging read "request_log" --limit=10 --format=json将其格式化为json,以便随后可以使用jq对其进行解析
  3. 将输出管道输送到jq,以便仅输出日志消息,而不输出所有其他有效负载数据,例如jq ".[].protoPayload.line | .[] | .logMessage"

因此完整的命令应该是:

watch -n 1 'gcloud logging read "request_log" --limit=10 --format=json | jq ".[].protoPayload.line | .[] | .logMessage"'

因此,如果日志条目是这样的:

[
  {
    "httpRequest": {
      "status": 200
    },
    ...,
    "protoPayload": {
      "@type": "type.googleapis.com/google.appengine.logging.v1.RequestLog",
      ...
      "line": [
        {
          "logMessage": "This is an info message",
          "severity": "INFO",
          ...

        }
      ]
    }
    ...
  }
]

然后使用jq ".[].protoPayload.line | .[] | .logMessage",您将只获得以下内容:

"This is an info message"

您还可以添加.time,以便获取日志消息的时间戳:

jq ".[].protoPayload.line | .[] | .logMessage ,.time"

答案 3 :(得分:-1)

我正在使用laravel并遇到相同的问题。最后,我添加了{{1} 添加

app.yaml

多数民众赞成在帮助我跟踪这样的应用程序日志:

env_variables:
    ...
    LOG_CHANNEL: stderr

作为建议,$ data应该像JSON一样-便于通过控制台阅读。