L’intégration NestJS de ClickStack vous permet de créer un logger ou d’utiliser le
logger par défaut pour envoyer des logs vers ClickStack (basé sur nest-winston).
Ce guide intègre :
| ✅ Logs | ✖️ Métriques | ✖️ Traces |
Pour envoyer également des métriques ou des traces/APM, vous devrez aussi ajouter
à votre application l’intégration de langage correspondante.
Importez HyperDXNestLoggerModule dans l’AppModule racine et utilisez la méthode forRoot()
pour le configurer.
import { Module } from '@nestjs/common';
import { HyperDXNestLoggerModule } from '@hyperdx/node-logger';
@Module({
imports: [
HyperDXNestLoggerModule.forRoot({
url: 'http://your-otel-collector:4318',
apiKey: ***YOUR_INGESTION_API_KEY***, // Not need for Managed ClickStack
maxLevel: 'info',
service: 'my-app',
}),
],
})
export class AppModule {}
Par la suite, l’instance winston pourra être injectée dans tout le
projet à l’aide du jeton d’injection 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: '🐱' });
}
}
Remplacer le logger de Nest (y compris pour l’amorçage)
ImportantEn procédant ainsi, vous renoncez à l’injection de dépendances, ce qui signifie que forRoot et forRootAsync ne sont pas nécessaires et ne doivent pas être utilisés. Supprimez-les de votre module principal.
L’utilisation de l’injection de dépendances présente un léger inconvénient. Nest doit d’abord amorcer l’application
(instancier les modules et les providers, injecter les dépendances,
etc.) et, pendant ce processus, l’instance de HyperDXNestLogger n’est pas encore
disponible, ce qui signifie que Nest se rabat sur le logger interne.
Une solution consiste à créer le logger en dehors du cycle de vie de l’application, à l’aide de
la fonction createLogger, puis à le passer à NestFactory.create. Nest va alors
encapsuler notre logger personnalisé (la même instance renvoyée par la méthode createLogger)
dans la classe Logger, en lui redirigeant tous les appels :
Créez le logger dans le fichier main.ts
import { HyperDXNestLoggerModule } from '@hyperdx/node-logger';
async function bootstrap() {
const app = await NestFactory.create(AppModule, {
logger: HyperDXNestLoggerModule.createLogger({
url: 'http://your-otel-collector:4318',
apiKey: ***YOUR_INGESTION_API_KEY***, // Not needed for Managed ClickStack
maxLevel: 'info',
service: 'my-app',
})
});
await app.listen(3000);
}
bootstrap();
Modifiez votre module principal pour qu’il fournisse le service Logger :
import { Logger, Module } from '@nestjs/common';
@Module({
providers: [Logger],
})
export class AppModule {}
Injectez ensuite simplement le logger en le typant avec le Logger de @nestjs/common :
import { Controller, Logger } from '@nestjs/common';
@Controller('cats')
export class CatsController {
constructor(private readonly logger: Logger) {}
meow() {
this.logger.log({ message: '🐱' });
}
}