Belajar NestJS - Logging, Monitoring & Health
Episode 9 of 24

Belajar NestJS - Logging, Monitoring & Health

Episode ini membahas observability dasar NestJS: built-in Logger dan custom logger service, integrasi logging eksternal dengan Winston dan Pino, health checks memakai @nestjs/terminus, serta pola dasar metrics dan observability.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

Aplikasi yang tidak bisa diamati adalah kotak hitam — ketika error terjadi di production, kalian tidak tahu apa yang sedang terjadi. Observability dimulai dari logging yang baik, health checks, dan monitoring dasar.

Episode 9 membahas built-in logger, integrasi dengan Winston dan Pino, health checks dengan @nestjs/terminus, serta pola observability dasar.

Built-in Logger

Logger Bawaan NestJS

NestJS menyediakan Logger dari @nestjs/common:

JSMenggunakan Logger bawaan
import { Injectable, Logger } from "@nestjs/common";
 
@Injectable()
export class UsersService {
  private readonly logger = new Logger(UsersService.name);
 
  findAll(): string[] {
    this.logger.log("Memuat semua user");
    this.logger.warn("Ini peringatan");
    return ["Arman", "Budi"];
  }
}

Method log, warn, error, dan debug memberi level yang berbeda. Konteks UsersService.name membantu mengidentifikasi sumber log.

Custom Logger Service

Untuk kontrol penuh, buat service yang mengimplementasikan LoggerService:

JSCustom logger service
import { Injectable, LoggerService } from "@nestjs/common";
 
@Injectable()
export class AppLogger implements LoggerService {
  log(message: string): void {
    console.log(`[INFO] ${message}`);
  }
 
  error(message: string, trace?: string): void {
    console.error(`[ERROR] ${message}`, trace ?? "");
  }
 
  warn(message: string): void {
    console.warn(`[WARN] ${message}`);
  }
}

Custom logger bisa di-inject ke seluruh aplikasi dan mengganti logger bawaan.

Integrasi Logging Eksternal

Pino dengan nestjs-pino

Pino adalah logger berperforma tinggi dengan output JSON. Integrasikan lewat package nestjs-pino:

Install nestjs-pino
npm install nestjs-pino pino-http
JSMengaktifkan LoggerModule Pino
import { Module } from "@nestjs/common";
import { LoggerModule } from "nestjs-pino";
 
@Module({
  imports: [
    LoggerModule.forRoot({
      pinoHttp: {
        transport: process.env.NODE_ENV !== "production"
          ? { target: "pino-pretty" }
          : undefined,
      },
    }),
  ],
})
export class AppModule {}

Output JSON Pino mudah di-parsing oleh tool log seperti Loki, CloudWatch, atau ELK.

Winston

Winston adalah logger populer dengan sistem transport yang fleksibel — bisa menulis ke file, console, atau service eksternal. Pilihan antara Pino dan Winston bergantung kebutuhan: Pino unggul di performa, Winston unggul di fleksibilitas transport.

Health Checks dengan @nestjs/terminus

Install dan Setup

@nestjs/terminus menyediakan indikator kesehatan siap pakai:

Install @nestjs/terminus
npm install @nestjs/terminus
JSHealthController dengan database check
import { Controller, Get } from "@nestjs/common";
import { HealthCheck, HealthCheckService, TypeOrmHealthIndicator } from "@nestjs/terminus";
 
@Controller("health")
export class HealthController {
  constructor(
    private readonly health: HealthCheckService,
    private readonly db: TypeOrmHealthIndicator,
  ) {}
 
  @Get()
  @HealthCheck()
  check() {
    return this.health.check([
      () => this.db.pingCheck("database"),
    ]);
  }
}

Endpoint GET /health kini memeriksa koneksi database dan mengembalikan status.

Memeriksa Response Health

Contoh response health check
{
  "status": "ok",
  "info": {
    "database": { "status": "up" }
  },
  "details": {
    "database": { "status": "up" }
  }
}

Health check ini dipakai Kubernetes dan load balancer untuk memutuskan apakah instance menerima traffic.

Basic Metrics dan Observability

Pola Observability Dasar

Observability punya tiga pilar: log, metrics, dan trace. Untuk metrics dasar, NestJS menyediakan integrasi dengan Prometheus lewat package @willsoto/nestjs-prometheus. Pola yang perlu diperhatikan sejak awal:

  • Log terstruktur dengan konteks dan request id.
  • Health check untuk dependensi eksternal seperti database.
  • Metrics untuk request rate, error rate, dan latensi.
Install nestjs-prometheus
npm install @willsoto/nestjs-prometheus prom-client

Metrics kemudian diekspos di endpoint /metrics yang dibaca oleh Prometheus.

Penutup

Episode 9 membangun fondasi observability: logger bawaan dan custom, integrasi Pino dan Winston, health checks dengan terminus, serta pengantar metrics dengan Prometheus.

Inti yang harus dibawa pulang:

  • Logger dari @nestjs/common memberi level dan konteks.
  • Custom logger mengimplementasikan LoggerService.
  • nestjs-pino menghasilkan log JSON berperforma tinggi.
  • Winston unggul di fleksibilitas transport.
  • @nestjs/terminus menyediakan health check untuk database.
  • Metrics dan trace melengkapi pilar observability selain log.

Di episode 10 selanjutnya kita akan membahas transaction dan persistence advanced — manajemen transaksi dengan database adapter, unit of work dan repository orchestration, optimasi query serta eager dan lazy loading, dan connection pooling untuk tuning performa.