You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查看GKE上Jenkins Kubernetes容器内Java应用的Stackdriver日志

根因说明
  • Jenkins日志缺失:你在sh步骤中使用&将Java进程放到后台运行,Jenkins的sh步骤默认仅捕获前台进程的stdout/stderr输出,后台进程的日志不会被agent收集到构建日志中。
  • Stackdriver日志缺失:GKE默认的日志采集组件Fluentd仅采集容器1号进程的stdout/stderr输出,你定义的maven容器1号进程为cat命令,后台启动的Java进程的输出未重定向到1号进程的标准输出,因此无法被采集到Stackdriver。
解决方案

场景1:Java应用需要后台运行(如启动后执行后续接口测试等操作)

修改sh命令,将Java进程的输出重定向到容器1号进程的标准输出,同时可选择将日志落地到本地文件方便后续打印到Jenkins构建日志:

container('maven') {
    // 启动Java应用,输出同时重定向到容器stdout(供Stackdriver采集)和本地文件(供Jenkins打印)
    sh "java -jar my-app.jar 2>&1 | tee /tmp/app.log > /proc/1/fd/1 & echo \$! > /tmp/app.pid"
    
    // 此处可添加你的后续测试逻辑,比如等待应用启动、调用接口测试等
    // sh "sleep 10 && curl http://localhost:8080/health"
    
    // 测试完成后杀死后台Java进程
    sh "kill \$(cat /tmp/app.pid)"
    
    // 打印应用日志到Jenkins构建日志
    sh "cat /tmp/app.log"
}

说明:/proc/1/fd/1是容器1号进程的标准输出路径,/proc/1/fd/2是标准错误路径,重定向到这两个路径的内容都会被Fluentd采集到Stackdriver。

场景2:Java应用无需后台运行(执行完成后自动退出)

直接删除sh命令末尾的&即可,Java进程前台运行的输出会直接被Jenkins agent收集到构建日志,同时也会被Fluentd采集到Stackdriver:

container('maven') {
    sh "java -jar my-app.jar"
}
可选优化

你可以在podTemplate的Pod定义中添加自定义标签,方便后续在Stackdriver中快速筛选PR校验产生的应用日志:

apiVersion: v1
kind: Pod
metadata:
  labels:
    jenkins-job-type: pr-validation
spec:
  # 原有配置保持不变

内容的提问来源于stack exchange,提问作者kpater87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:15:03