メインコンテンツまでスキップ
メインコンテンツまでスキップ

NestJS

The ClickStack NestJS統合により、ロガーを作成するか、デフォルトのロガーを使用してClickStackにログを送信できます(nest-winstonにより提供されています)。

このガイドでは以下を統合します:

✅ ログ✖️ メトリクス✖️ トレース

メトリクスやAPM/トレースを送信するには、対応する言語統合をアプリケーションに追加する必要があります。

始めに

HyperDXNestLoggerModuleをルートのAppModuleにインポートし、forRoot()メソッドを使用して構成します。

import { Module } from '@nestjs/common';
import { HyperDXNestLoggerModule } from '@hyperdx/node-logger';

@Module({
  imports: [
    HyperDXNestLoggerModule.forRoot({
      apiKey: ***YOUR_INGESTION_API_KEY***,
      maxLevel: 'info',
      service: 'my-app',
    }),
  ],
})
export class AppModule {}

その後、winstonインスタンスは、プロジェクト全体でHDX_LOGGER_MODULE_PROVIDERインジェクショントークンを使用して注入できるようになります:

import { Controller, Inject } from '@nestjs/common';
import { HyperDXNestLoggerModule, HyperDXNestLogger } from '@hyperdx/node-logger';

@Controller('cats')
export class CatsController {
  constructor(
    @Inject(HyperDXNestLoggerModule.HDX_LOGGER_MODULE_PROVIDER)
    private readonly logger: HyperDXNestLogger,
  ) { }

  meow() {
    this.logger.info({ message: '🐱' });
  }
}

Nestロガーの置き換え(ブートストラッピング用にも)

重要

これを行うことで、依存性注入を放棄することになります。つまり、forRootおよびforRootAsyncは必要なく、使用すべきではありません。メインモジュールからそれらを削除してください。

依存性注入を使用することには一つの小さな欠点があります。Nestはまずアプリケーションをブートストラップする必要があります(モジュールやプロバイダーをインスタンス化し、依存関係を注入など)が、このプロセス中にHyperDXNestLoggerのインスタンスはまだ利用できず、Nestは内部ロガーにフォールバックします。

1つの解決策は、アプリケーションライフサイクルの外側でロガーを作成し、createLogger関数を使用してこれをNestFactory.createに渡すことです。Nestは私たちのカスタムロガー(createLoggerメソッドによって返される同じインスタンス)をLoggerクラスにラップし、すべての呼び出しをそれにフォワードします:

main.tsファイルでロガーを作成します

import { HyperDXNestLoggerModule } from '@hyperdx/node-logger';

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    logger: HyperDXNestLoggerModule.createLogger({
      apiKey: ***YOUR_INGESTION_API_KEY***,
      maxLevel: 'info',
      service: 'my-app',
    })
  });
  await app.listen(3000);
}
bootstrap();

メインモジュールを変更してLoggerサービスを提供します:

import { Logger, Module } from '@nestjs/common';

@Module({
  providers: [Logger],
})
export class AppModule {}

その後、@nestjs/commonからのLoggerで型ヒントを付けて単純にロガーを注入します:

import { Controller, Logger } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  constructor(private readonly logger: Logger) {}

  meow() {
    this.logger.log({ message: '🐱' });
  }
}