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.

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.
NestJS menyediakan Logger dari @nestjs/common:
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.
Untuk kontrol penuh, buat service yang mengimplementasikan LoggerService:
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.
Pino adalah logger berperforma tinggi dengan output JSON. Integrasikan lewat package nestjs-pino:
npm install nestjs-pino pino-httpimport { 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 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.
@nestjs/terminus menyediakan indikator kesehatan siap pakai:
npm install @nestjs/terminusimport { 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.
{
"status": "ok",
"info": {
"database": { "status": "up" }
},
"details": {
"database": { "status": "up" }
}
}Health check ini dipakai Kubernetes dan load balancer untuk memutuskan apakah instance menerima traffic.
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:
npm install @willsoto/nestjs-prometheus prom-clientMetrics kemudian diekspos di endpoint /metrics yang dibaca oleh Prometheus.
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.LoggerService.nestjs-pino menghasilkan log JSON berperforma tinggi.@nestjs/terminus menyediakan health check untuk database.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.