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

如何让Winston所有logger.error调用都显示在GCP错误报告面板?

让所有Winston error日志都显示在GCP错误报告面板

要实现所有logger.error调用都被GCP错误报告收录,核心是让每个error级别的日志条目符合GCP错误报告的识别规则——即包含特定的结构化元数据,告诉GCP这是一个需要跟踪的错误事件。以下是具体实现步骤:

关键原理

GCP错误报告默认识别两种日志条目:

  1. 包含完整堆栈跟踪的Error对象日志
  2. 带有@type字段为type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent的结构化JSON日志

我们需要给所有logger.error的日志强制添加这个结构化元数据,不管传入的是字符串还是其他类型。

实现步骤

1. 自定义Winston格式化器

在创建Winston logger时,添加一个自定义格式化器,专门处理error级别的日志,注入错误报告所需的元数据:

const { LoggingWinston } = require('@google-cloud/logging-winston');
const winston = require('winston');

// 初始化GCP Logging Winston传输器
const loggingWinston = new LoggingWinston({
  projectId: '你的GCP项目ID',
});

// 自定义格式化器:为所有error日志添加错误报告元数据
const errorReportingFormatter = winston.format((info) => {
  if (info.level === 'error') {
    // 标记这是一个错误报告事件
    info['@type'] = 'type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent';
    
    // 设置服务上下文(用于错误分组,根据你的实际服务信息修改)
    info.serviceContext = {
      service: '你的服务名称', // 例如:user-api
      version: 'v1.0.0' // 可选,用于区分不同版本的错误
    };

    // 处理非Error类型的输入:包装成包含message和模拟堆栈的结构
    if (!(info.message instanceof Error)) {
      info.message = {
        message: info.message,
        // 模拟堆栈(GCP错误报告需要堆栈来完成分组,可根据需求调整)
        stack: `Error: ${info.message}\n    at ${new Date().toISOString()} [自定义错误]`
      };
    }
  }
  return info;
});

// 创建最终的logger实例
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    errorReportingFormatter(),
    winston.format.json() // 必须使用JSON格式,GCP才能解析结构化元数据
  ),
  transports: [
    new winston.transports.Console(),
    loggingWinston,
  ],
});

2. 验证效果

现在不管你调用logger.error传入的是字符串还是Error对象,都会被GCP错误报告识别:

// 字符串类型的错误
logger.error('用户登录失败:用户名不存在');

// Error对象类型的错误
logger.error(new Error('数据库连接超时'));

注意事项

  • 权限检查:确保你的服务账号拥有errorreporting.events.create权限(通常默认的日志服务账号已包含此权限)。
  • 错误分组逻辑:GCP错误报告会根据serviceContext和堆栈信息进行分组,模拟的堆栈会让相同消息的错误归为同一组,如果你需要更精细的分组,可以调整模拟堆栈的内容。
  • JSON格式要求:必须使用winston.format.json(),否则GCP无法解析添加的结构化元数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:20:37