Cloud Run Job中@google-cloud/logging日志未在GCP日志资源管理器显示的问题
问题:Cloud Run Job中@google-cloud/logging日志不显示的排查
背景信息
我运行一个使用@google-cloud/logging库(版本11.0.0)的NodeJS应用,将其打包为Docker镜像存储在Artifact Registry中,随后通过Terraform创建cloud_run_v2_job资源引用该镜像。
应用中初始化日志客户端的代码:
const logging = new Logging(); const log = logging.log('myLog');
写入日志的代码:
const message = "My message" const entry = log.entry({ severity: 'INFO' }, { message }); log.write(entry);
遇到的问题:这些日志并未在日志资源管理器中显示,但console.log语句的日志能正常显示。将日志代码包裹在try-catch块中未捕获到任何错误,说明代码执行无异常。
尝试的权限配置(Terraform):
data "google_project" "current" {} resource "google_project_iam_member" "cloudrun_logging_permission" { project = data.google_project.current.project_id role = "roles/logging.logWriter" member = "serviceAccount:${data.google_project.current.number}-compute@developer.gserviceaccount.com" }
但问题仍未解决,需要排查遗漏的配置。
问题分析与解决方案
1. 服务账号权限配置错误
你当前配置的是Compute Engine默认服务账号,但Cloud Run Job默认使用的是Cloud Run服务代理账号,而非Compute Engine的账号。
- 若Terraform的
cloud_run_v2_job未指定service_account字段,默认服务账号格式为:service-${PROJECT_NUMBER}@gcp-sa-cloudrun.iam.gserviceaccount.com - 若你自定义了服务账号并在Job中指定,则需给该自定义账号配置权限
修正后的Terraform权限配置:
data "google_project" "current" {} resource "google_project_iam_member" "cloudrun_job_log_writer" { project = data.google_project.current.project_id role = "roles/logging.logWriter" member = "serviceAccount:service-${data.google_project.current.number}@gcp-sa-cloudrun.iam.gserviceaccount.com" }
2. 异步日志写入未等待完成
log.write()是异步操作,返回Promise。你原代码未使用await等待操作完成,若进程提前退出,日志可能还未发送就被终止,且异步错误无法被同步的try-catch捕获。
修正后的日志代码:
try { const message = "My message" const entry = log.entry({ severity: 'INFO' }, { message }); await log.write(entry); // 添加await等待异步操作完成 } catch (err) { console.error('日志写入失败:', err); }
3. 确认日志查看路径
@google-cloud/logging写入的是自定义日志,需在日志资源管理器中使用正确的过滤器查找:
- 过滤器示例:
logName="projects/[你的项目ID]/logs/myLog" - 注意区分:
console.log的日志会出现在Cloud Run Job的系统日志流中,而自定义日志需要单独通过日志名称过滤。
内容的提问来源于stack exchange,提问作者Diego Navarro Vergara
相关产品推荐
相关产品推荐

