google-kubernetes-engine - 如何在 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>
我错过了什么?
解决方案
我解决了这个问题。节点应用产生Java进程时,需要配置Java进程继承父级的stdio,像这样:
const child = spawn(cmd, args, { stdio: 'inherit' ))
推荐阅读
- java - 无法在 Linux 上的 Intellij 中指定 SDK
- node.js - 如何使用 nodeJs 在两个微服务之间调用或触发函数
- google-cloud-firestore - HomeGraph 查询响应与来自云服务的查询响应不匹配[FireStore] - Google Smart Home
- php - 如何使用 Carbon 获得一个月内的所有时间
- c# - 计算datagridview行
- onclick - 酶在给定位置模拟 onClick 事件
- sql-server - 部署数据库项目会影响数据库服务器上的其他数据库吗?
- android - Android WebView全屏视频退出创建额外的空白区域
- ruby-on-rails - 如何使用 kaminari gem 在引导模式中实现 ajax 分页
- jenkins - 如何处理并发 docker 登录