Nest.js Monorepo中New Relic日志转发失效问题排查求助
1. 修复环境变量冲突
你的.env中设置了NEW_RELIC_NO_CONFIG_FILE=true,这会让New Relic代理忽略newrelic.js配置文件,仅使用环境变量加载配置。但你只设置了NEW_RELIC_APPLICATION_LOGGING_FORWARDING_ENABLED=true,未显式开启顶层的application_logging.enabled(默认值为false),这会导致日志转发功能未激活。
解决方法:
- 要么移除
NEW_RELIC_NO_CONFIG_FILE=true,让代理加载newrelic.js中的完整配置; - 要么在
.env中添加NEW_RELIC_APPLICATION_LOGGING_ENABLED=true,确保日志转发的顶层开关打开。
2. 确认Nest-Pino日志输出到标准流
New Relic Node.js代理默认捕获stdout和stderr的日志,需确保Nest-Pino的日志输出没有被定向到文件或其他非标准流。
检查你的Nest-Pino配置,确保没有设置file或其他自定义输出路径,示例正确配置:
// src/main.ts import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { Logger as PinoLogger } from 'nestjs-pino'; async function bootstrap() { const app = await NestFactory.create(AppModule, { bufferLogs: true }); app.useLogger(app.get(PinoLogger)); await app.listen(3000); } bootstrap();
3. 验证Monorepo启动时正确加载New Relic代理
在Monorepo中,每个服务的启动命令必须确保New Relic代理被前置加载,否则日志无法被拦截转发。
错误启动方式:
node dist/packages/api/main.js
正确启动方式(使用-r参数预加载New Relic):
node -r newrelic dist/packages/api/main.js
如果使用package.json的scripts,修改为:
{ "scripts": { "start:api": "node -r newrelic dist/packages/api/main.js" } }
4. 检查New Relic代理日志的错误信息
你的newrelic.js中已开启logging.level: 'trace',代理会生成详细日志。查看这些日志,搜索以下关键词定位问题:
application-logging:查看是否有转发失败的提示;error:检查是否存在网络连接、权限或格式错误;log event:确认代理是否成功捕获日志事件。
代理日志默认路径:
- Linux/macOS:
/var/log/newrelic/node_agent.log - Windows:
C:\Program Files\New Relic\newrelic-node-agent\node_agent.log
5. 确认日志级别匹配
New Relic默认只转发info及以上级别的日志,需确保Nest-Pino的日志级别不低于info。检查你的Pino配置:
// app.module.ts import { Module } from '@nestjs/common'; import { LoggerModule } from 'nestjs-pino'; @Module({ imports: [ LoggerModule.forRoot({ level: process.env.NODE_ENV === 'production' ? 'info' : 'debug', }), ], }) export class AppModule {}
6. 验证配置文件位置(针对Monorepo)
如果保留newrelic.js配置文件,需确保它位于服务启动时的工作目录。在Monorepo中,若你从根目录启动服务,配置文件放在根目录即可;若从子package目录启动,需将配置文件复制到子package目录,或通过环境变量NEW_RELIC_CONFIG_FILE指定路径:
NEW_RELIC_CONFIG_FILE=../../newrelic.js node -r newrelic dist/main.js
内容的提问来源于stack exchange,提问作者Muhammad Awais Shah

