如何将NestJS对接New Relic实现预发/生产环境错误上报?
解决NestJS下通过winston链路上报错误到New Relic的方案
前置校验
- 确认你已经在项目根目录放置了
newrelic.js配置文件,或者通过环境变量配置了NEW_RELIC_LICENSE_KEY、NEW_RELIC_APP_NAME两个必填参数,这是上报数据的身份凭证,缺省会直接导致上报失败。
特别注意:newrelic-winston和winston存在严格的版本适配关系,newrelic-winston@2.x仅支持winston@3.x,如果你使用的是winston@2.x请降级到newrelic-winston@1.x,否则会出现传输器初始化失败的问题
正确配置nest-winston的New Relic传输器
你需要将newrelic-winston的传输器添加到nest-winston的传输数组中,仅配置控制台传输器不会触发数据上报,参考配置如下:
import { Module } from '@nestjs/common'; import { WinstonModule } from 'nest-winston'; import * as winston from 'winston'; // 该包暂不支持ES模块默认导入,使用require引入即可 const NewRelicWinston = require('newrelic-winston'); @Module({ imports: [ WinstonModule.forRoot({ levels: winston.config.npm.levels, format: winston.format.combine( winston.format.timestamp(), winston.format.json() ), transports: [ // 保留原有的控制台输出传输器 new winston.transports.Console({ level: 'silly', }), // 新增New Relic上报传输器 new NewRelicWinston({ // 仅上报error级别日志,可根据需求调整为info等更低级别 level: 'error', licenseKey: process.env.NEW_RELIC_LICENSE_KEY, appName: process.env.NEW_RELIC_APP_NAME, // 开启后会自动附带错误堆栈信息上报 addErrorTrace: true, }) ] }) ] }) export class AppModule {}
上报效果验证
- 配置完成后主动抛出测试错误验证,比如在任意业务接口中执行
throw new Error('测试上报到New Relic的错误') - New Relic数据上报存在1-3分钟的延迟,等待后进入New Relic控制台,在
Logs菜单下筛选对应应用名即可查看上报的错误日志 - 若仍看不到数据,可添加环境变量
NEW_RELIC_LOG_LEVEL=debug开启New Relic debug日志,启动项目后排查控制台输出的报错,常见问题为鉴权失败、出口网络限制
常见问题排查
- 如果你自定义了全局异常过滤器,需要确保捕获错误后调用了
logger.error()方法打印错误,仅返回响应不打印日志不会触发传输器上报 - 预发/生产环境如果配置了出口网络限制,需要放开New Relic上报域名的访问权限,国内环境建议配置亚太区域上报端点,在
newrelic.js中添加host: 'log-api.ap-southeast-1.newrelic.com'即可 - 配置winston格式化规则时,不要过滤掉错误对象的
stack属性,否则上报的错误不会附带堆栈信息
内容的提问来源于stack exchange,提问作者Narek Keshishyan
相关产品推荐
相关产品推荐

