如何让Winston所有logger.error调用都显示在GCP错误报告面板?
让所有Winston error日志都显示在GCP错误报告面板
要实现所有logger.error调用都被GCP错误报告收录,核心是让每个error级别的日志条目符合GCP错误报告的识别规则——即包含特定的结构化元数据,告诉GCP这是一个需要跟踪的错误事件。以下是具体实现步骤:
关键原理
GCP错误报告默认识别两种日志条目:
- 包含完整堆栈跟踪的
Error对象日志 - 带有
@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
相关产品推荐
相关产品推荐

