如何查看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
相关产品推荐
相关产品推荐

