如何在 Java 应用程序中从 GKE 登录 Stackdriver
How to log to Stackdriver from GKE in a Java application
我在 GKE 上的容器中 运行 宁一个 Java/Scala 应用程序,并且日志没有填充到 Stackdriver 中。
GCP 控制台显示集群上启用了 "Stackdriver Kubernetes Engine Monitoring",禁用了 "Legacy Stackdriver Logging"。
我尝试了两种类型的 logback 文件,一种使用 ConsoleAppender
,一种使用 com.google.cloud.logging.logback.LoggingAppender
,但都不起作用。
如果我在 GKE 中 运行 一个 node.js 应用程序,那么 console.log 条目会显示在 Stackdriver 中。
添加一些可能有助于澄清的更多细节,我的主要应用程序容器是一个生成 Java 应用程序的 Node 应用程序。 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>
我错过了什么?
目前这是 Beta 版,处于预发布状态,可能会更改或支持有限。
但是你要找的是这里:
我想通了。当节点应用程序生成 Java 进程时,它需要配置 Java 进程以继承父级的 stdio,如下所示:
const child = spawn(cmd, args, { stdio: 'inherit' ))
我在 GKE 上的容器中 运行 宁一个 Java/Scala 应用程序,并且日志没有填充到 Stackdriver 中。
GCP 控制台显示集群上启用了 "Stackdriver Kubernetes Engine Monitoring",禁用了 "Legacy Stackdriver Logging"。
我尝试了两种类型的 logback 文件,一种使用 ConsoleAppender
,一种使用 com.google.cloud.logging.logback.LoggingAppender
,但都不起作用。
如果我在 GKE 中 运行 一个 node.js 应用程序,那么 console.log 条目会显示在 Stackdriver 中。
添加一些可能有助于澄清的更多细节,我的主要应用程序容器是一个生成 Java 应用程序的 Node 应用程序。 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>
我错过了什么?
目前这是 Beta 版,处于预发布状态,可能会更改或支持有限。
但是你要找的是这里:
我想通了。当节点应用程序生成 Java 进程时,它需要配置 Java 进程以继承父级的 stdio,如下所示:
const child = spawn(cmd, args, { stdio: 'inherit' ))