使用pino-sentry-transport无法向Sentry发送错误的求助
解决方案
一、修复 pino-sentry-transport 无效问题
先排查并调整以下几个核心点:
- 确认Sentry DSN完全正确,和生产环境项目的DSN严格匹配,无拼写或大小写错误。
- 日志调用必须传递Error实例,不能只传字符串。比如要用
logger.error(new Error('具体错误'), '附加描述'),而非logger.error('错误消息')。 - 调整格式化配置,确保错误字段的栈信息被保留,避免transport无法识别错误结构。
修改后的配置示例:
import pino from 'pino'; const logger = pino({ level: 'error', formatters: { level: (label) => ({ level: label }), // 保留错误原生字段,确保transport能识别栈信息 error: (err) => ({ type: err.name, message: err.message, stack: err.stack }) }, timestamp: () => `,"timestamp":"${new Date().toISOString()}"`, transport: { target: 'pino-sentry-transport', options: { sentry: { dsn: '你的生产环境Sentry DSN', environment: 'production' }, // 明确指定仅发送error及以上级别日志 level: 'error' } } }); // 正确的错误日志调用方式 logger.error(new Error('数据库连接超时'), '用户登录流程异常');
二、修复 pino-sentry 流方式的问题
你当前代码同时配置了transport和stream,导致配置冲突,所以要去掉transport配置,仅保留stream方式,同时确保错误对象的正确传递:
修改后的配置示例:
import pino from 'pino'; import { createWriteStream } from 'pino-sentry'; // 创建Sentry流,指定上报级别为error const sentryStream = createWriteStream({ dsn: '你的生产环境Sentry DSN', level: 'error', environment: 'production' }); const logger = pino({ level: 'error', formatters: { level: (label) => ({ level: label }), // 保留错误栈信息的格式化规则 error: (err) => ({ type: err.name, message: err.message, stack: err.stack }) }, timestamp: () => `,"timestamp":"${new Date().toISOString()}"` }, sentryStream); // 捕获错误并上报的正确姿势 try { // 模拟业务错误 throw new Error('订单创建失败'); } catch (err) { logger.error(err, '订单处理流程出错'); }
关键注意事项
- 必须传递Error实例:只有把Error对象作为
logger.error()的第一个参数,Sentry才能捕获到完整的错误栈和上下文信息,仅传字符串只会生成无栈的简单消息。 - 避免配置冲突:不要同时使用
transport和stream两种方式,二选一即可,否则会导致级别过滤失效或日志重复上报。 - 验证依赖版本:确保
pino、pino-sentry、pino-sentry-transport版本兼容,比如Pino v8+需要对应版本的transport支持。 - 检查Sentry项目设置:确认生产环境项目没有拦截错误上报,DSN对应的权限正常。
内容的提问来源于stack exchange,提问作者Slim
相关产品推荐
相关产品推荐

