Belajar Node.js - Logging, Environment Config, dan Pengaturan Runtime
Episode 12 of 23

Belajar Node.js - Logging, Environment Config, dan Pengaturan Runtime

Episode ini merapikan runtime aplikasi: memuat konfigurasi dari environment variables dan file .env, membedakan NODE_ENV, logging terstruktur dengan pino, serta memahami level log untuk produksi. Semua ini adalah syarat aplikasi yang bisa di-deploy.

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

Pendahuluan

Aplikasi yang hanya berjalan di laptop pengembangnya belum bisa disebut aplikasi. Aplikasi nyata dijalankan di banyak environment — local, staging, produksi — masing-masing dengan konfigurasi berbeda: port, koneksi database, kunci rahasia. Konfigurasi ini tidak boleh di-hardcode.

Episode 12 membahas tiga pilar pengaturan runtime: environment variables dan file .env, pembedaan NODE_ENV untuk tiap lingkungan, serta logging terstruktur dengan pino. Setelah episode ini, aplikasi kalian siap menempuh perjalanan menuju produksi.

Environment Variables dan File .env

Menyimpan Konfigurasi di Luar Kode

Environment variable adalah pasangan nama dan nilai yang diinjeksi ke proses. Node.js menyediakannya lewat process.env. Nilai rahasia seperti JWT_SECRET dari episode 11 dan DATABASE_URL hidup di sini — bukan di kode.

Cara termudah untuk mengelolanya saat development adalah file .env:

Memuat file .env
node --env-file=.env app.js

Flag node --env-file=.env app.js membuat Node.js membaca file .env dan mengekspornya ke process.env — tanpa paket tambahan. Tambahkan .env ke .gitignore agar rahasia tidak pernah masuk ke repository.

Membaca Konfigurasi di Kode

JSMembaca environment variables
const port = Number(process.env.PORT ?? 3000);
const nama = process.env.APP_NAME ?? "belajar-nodejs";
 
console.log(nama, port);

Pola process.env.PORT ?? 3000 memakai default ketika variabel tidak diset. Konversi Number(...) penting karena semua nilai process.env berbentuk string. Operator nullish ?? hanya menggantikan null atau undefined, jadi string kosong tetap dihormati.

NODE_ENV dan Pengaturan Runtime

Mengapa NODE_ENV Penting

NODE_ENV adalah konvensi yang memberi tahu aplikasi environment saat ini: development, test, atau production. Banyak framework memakai nilainya untuk mengaktifkan atau mematikan fitur:

Menjalankan dengan NODE_ENV
NODE_ENV=production node app.js
NODE_ENV=test node --test

NODE_ENV=production node app.js membuat aplikasi berjalan dalam mode produksi — Express mematikan detail stack trace yang bocor di respons error. Nilai default di development adalah development jika tidak diset secara eksplisit.

Penyesuaian Berdasarkan Environment

JSPerilaku berdasarkan environment
if (process.env.NODE_ENV === "production") {
  app.set("trust proxy", 1);
}

Gunakan NODE_ENV untuk perbedaan perilaku, bukan untuk menyimpan rahasia — rahasia tetap di process.env terpisah. Contoh di atas hanya mengaktifkan trust proxy di produksi, karena header proxy palsu berbahaya ketika langsung terpapar internet.

Logging Terstruktur dengan pino

Mengapa console.log Tidak Cukup

console.log mengeluarkan teks yang sulit diurai mesin. Di produksi, kalian butuh logging terstruktur — setiap baris log berupa JSON yang bisa difilter, dikumpulkan, dan di-query. pino adalah pilihan paling populer dan sangat cepat:

Install pino
npm install pino

npm install pino menambahkan logger dengan dukungan JSON dan level log. pino sangat cepat karena memakai serialisasi yang dioptimalkan — penting untuk server yang melayani ribuan request.

JSLogging terstruktur dengan pino
import pino from "pino";
 
const logger = pino({ level: process.env.LOG_LEVEL ?? "info" });
 
logger.info("Server mulai");
logger.info({ userId: 42 }, "Pengguna masuk");
logger.error({ err: new Error("koneksi gagal") }, "Database tidak merespons");

pino({ level: process.env.LOG_LEVEL ?? "info" }) membuat logger dengan level bawaan info. Perhatikan perbedaan bentuk: logger.info({ userId: 42 }, "Pesan") menempelkan konteks terstruktur, dan logger.error({ err: ... }, "...") menyertakan objek error lengkap dengan stack trace — jauh lebih berguna untuk debugging daripada teks polos.

Level Logging dan Praktik Terbaik

Lima Level Standar

pino mengikuti level log standar, dari paling tenang ke paling detail: fatal, error, warn, info, debug, trace. Prinsipnya:

  • error dan fatal: hal yang perlu perhatian segera.
  • warn: kondisi abnormal tapi tidak fatal.
  • info: peristiwa normal seperti server mulai.
  • debug: detail untuk pengembangan, biasanya dimatikan di produksi.

Atur level lewat LOG_LEVEL — produksi biasanya info atau warn, development sering debug. Log yang terlalu banyak justru membuat sinyal penting tenggelam.

Satu Logger untuk Semua

Jangan bikin beberapa logger dengan konfigurasi berbeda-beda. Buat satu modul logger dan impor di seluruh aplikasi, sehingga level dan formatnya konsisten. Di episode 22, log JSON ini akan langsung dialirkan ke sistem observability seperti Loki atau OpenSearch.

Penutup

Inti yang harus dibawa pulang:

  • Simpan konfigurasi dan rahasia di process.env, bukan di kode.
  • node --env-file=.env memuat file .env tanpa paket tambahan.
  • NODE_ENV membedakan development, test, dan production.
  • Logging terstruktur menghasilkan JSON yang siap di-query.
  • pino menggantikan console.log dengan serialisasi cepat.
  • Level log fatal hingga trace; sesuaikan LOG_LEVEL per environment.

Di episode 13 selanjutnya kita akan membahas database relasional vs NoSQL dalam Node.js — karakteristik SQL dan ACID, model document dari NoSQL, pertimbangan memilih berdasarkan data dan skenario, serta bagaimana keduanya digunakan dari kode Node.js. Ini pembuka fase data dari series ini.

Belajar Node.js - Logging, Environment Config, dan Pengaturan Runtime | Belajar Node.js