package main

import (
	"log/slog"
	"os"
)

// buangTime membuat opsi handler yang menghapus atribut time dari setiap
// baris log, sehingga output contoh ini identik di setiap eksekusi.
func buangTime() *slog.HandlerOptions {
	return &slog.HandlerOptions{
		Level: slog.LevelDebug,
		ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
			if a.Key == slog.TimeKey && len(groups) == 0 {
				return slog.Attr{}
			}
			return a
		},
	}
}

func main() {
	// TextHandler menulis log satu baris dengan format kunci=nilai.
	logger := slog.New(slog.NewTextHandler(os.Stdout, buangTime()))

	logger.Debug("memuat konfigurasi", "berkas", "app.toml")
	logger.Info("server siap", "port", 8080, "versi", "1.2.0")
	logger.Warn("koneksi lambat", "ulang", 3)
	logger.Error("gagal menyimpan", "penyebab", "disk penuh")

	// With menambah atribut tetap pada seluruh log turunannya.
	pelanggan := logger.With("layanan", "pelanggan")
	pelanggan.Info("profil diperbarui", "id", 42)

	// WithGroup memberi awalan grup pada atribut log turunannya.
	http := logger.WithGroup("http")
	http.Info("permintaan selesai", "status", 200, "metode", "GET")

	// JSONHandler menulis setiap log sebagai satu objek JSON.
	json := slog.New(slog.NewJSONHandler(os.Stdout, buangTime()))
	json.Info("pembayaran diterima", "jumlah", 150000, "mata_uang", "IDR")

	// SetDefault menjadikan logger ini logger default seluruh program.
	slog.SetDefault(logger)
	slog.Info("dari logger default")
}
