首页 > 解决方案 > 如何在 Java 应用程序中从 GKE 登录到 Stackdriver

问题描述

我在 GKE 上的容器中运行 Java/Scala 应用程序,但 Stackdriver 中没有填充日志。

GCP 控制台显示集群上启用了“Stackdriver Kubernetes Engine Monitoring”,并且禁用了“Legacy Stackdriver Logging”。

我尝试了两种类型的 logback 文件,一种 usingConsoleAppender和一种 using com.google.cloud.logging.logback.LoggingAppender,但都不起作用。

如果我在 GKE 中运行 node.js 应用程序,则 console.log 条目会显示在 Stackdriver 中。

为了添加一些可能有助于澄清的更多细节,我的主应用程序容器是一个 Node 应用程序,它生成了一个 Java 应用程序。Node 应用日志显示在 Stackdriver 中,但 Java 应用日志不显示。我确实将GOOGLE_APPLICATION_CREDENTIALS环境变量设置为我正在使用的服务帐户,并有权写入数据存储、云存储和 PubSub。我没有向该帐户添加日志记录权限,因为我认为还有另一个容器或较低级别的进程可以写入日志。

我尝试的最后一个 logback 文件是:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
       <target>System.out</target>
       <encoder>
           <pattern>%X{akkaTimestamp} %-5level[%thread] %logger{0} - %msg%n</pattern>
       </encoder>
    </appender>

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
       <appender-ref ref="STDOUT"/>
    </appender>

    <logger name="akka" level="INFO" />

    <root level="INFO">
       <appender-ref ref="STDOUT"/>
    </root>

</configuration>

我错过了什么?

标签: google-kubernetes-enginestackdrivergoogle-cloud-stackdrivergoogle-cloud-logging

解决方案


我解决了这个问题。节点应用产生Java进程时,需要配置Java进程继承父级的stdio,像这样:

const child = spawn(cmd, args, { stdio: 'inherit' ))

推荐阅读