Pencatatan log dengan logger

Modul logger: level, handler, formatter, dan metadata terstruktur.

Daftar isi

Topik ini memperkenalkan logger, kerangka pencatatan log bawaan OTP sejak versi 21: fungsi pencatatan per level, aturan penyaringan level, handler dan formatter yang dapat diganti, serta metadata yang membuat setiap baris log bisa diperkaya secara terstruktur. Semua contoh dieksekusi nyata di shell dengan handler bawaan.

Level dan fungsi pencatatan#

Logger menyediakan delapan level yang terurut dari yang paling rinci hingga yang paling berat: debug, info, notice, warning, error, critical, alert, dan emergency. Fungsi pencatatannya dinamai per level, dan argumennya berupa format ala io:format beserta datanya, ditambah map metadata opsional:

erlang Mencatat log pada dua level
Erlang/OTP 29 [erts-17.1.1] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]

Eshell V17.1.1 (press Ctrl+G to abort, type help(). for help)
1> logger:info("permintaan tiket dari ~p", [self()]).
ok
2> logger:warning("antrean hampir penuh", #{}).
=WARNING REPORT==== 3-Nov-2026::12:21:16.647900 ===
antrean hampir penuh
ok

Perhatikan perbedaan yang terlihat: panggilan info tidak tercetak karena level bawaan handler adalah notice, sedangkan warning melewati gerbang dan tercetak dengan kepala laporan berisi waktu penuh hingga mikrodetik. Nilai kembalian selalu ok karena pencatatan tidak boleh menggagalkan pemanggilnya, dan keputusan tampil bukan urusan pemanggil.

Saringan level utama#

Gerbang pertama setiap log adalah level utama (primary level), dan perubahan langsungnya terlihat:

erlang Menutup dan membuka kembali gerbang level
3> logger:set_primary_config(level, none).
ok
4> logger:info("tidak tercetak").
ok
5> logger:set_primary_config(level, info).
ok
6> logger:debug("level debug ikut tercetak?").
ok

Level none mematikan seluruh keluaran log, dan setelah dikembalikan ke info, panggilan debug yang lebih rinci tetap tersaring. Pemilihan level produksi adalah keputusan operasional: info sebagai bawaan yang sehat, debug untuk sesi penyelidikan, dan penurunan level untuk meredam banjir log sementara. Saringan berikutnya ada di handler, sehingga log yang ditolak satu handler masih dapat diterima handler lain, misalnya log debug yang dikirim ke berkas tetapi tidak ke terminal.

Handler, formatter, dan metadata#

Logger memisahkan tiga peran. Handler menentukan ke mana log dikirim, dengan satu handler bawaan bernama default yang menulis ke terminal dan dapat ditambah handler lain, misalnya ke berkas. Formatter menentukan bentuk barisnya, dan modul logger_formatter menyediakan templat yang menyusun waktu, level, pesan, dan metadata sesuai pilihan. Metadata adalah bagian yang membuat log terstruktur: peta bebas yang menyertai setiap panggilan, yang lazim diisi id permintaan, nama layanan, atau versi kode, sehingga baris log dapat dipadankan antar proses tanpa menguraikan teksnya. Metadata per proses juga dapat ditetapkan sekali lewat logger:update_process_metadata/1, dan setiap log yang ditulis proses itu membawanya secara otomatis.

Kebiasaan produksinya konsisten: pencatatan peristiwa bisnis yang layak dikenang, level yang sesuai kepentingannya, metadata yang memungkinkan pencarian lintas proses, dan volume yang dijaga karena setiap baris tetap berbiaya. Logger mengurus sisanya, termasuk antrean internalnya agar proses pencatat tidak terhambat oleh handler yang lambat.

Menambah handler berkas#

Log yang hanya hidup di terminal hilang saat sesi berakhir. Handler kedua ke berkas ditambahkan saat berjalan tanpa menyentuh konfigurasi bawaan:

erlang Menambah dan melepas handler berkas
1> logger:add_handler(berkas, logger_std_h,
2>                    #{config => #{file => "uji.log"}}).
ok
3> logger:info("tercatat ke berkas").
ok
4> logger:remove_handler(berkas).
ok

Handler logger_std_h menulis asinkron sehingga proses pencatat tidak menunggu disk, dan handler yang sama dapat dideklarasikan permanen pada sys.config release dengan konfigurasi formatter yang sama. Pemisahan peran inilah yang membuat log produksi fleksibel: log level rendah ke berkas yang dirotasi, log error ke terminal yang diawasi, dan metadata yang sama mengalir ke keduanya.

Perlu dicatat pula bagaimana logger bekerja di balik layar. Pesan yang dikirim proses masuk ke antrean internal logger, dan proses handler yang mengerjakannya menulis dengan kecepatan sendiri, sehingga proses bisnis tidak pernah menunggu disk. Bila handler mati atau terhambat, pesan ditangani sesuai kebijakan overload yang dapat disetel, dan peristiwa penurunannya dilaporkan sekali di log. Konsekuensi bagi penulis kode: argumen yang dihitung untuk format tetap dievaluasi saat pemanggilan, sehingga pembangunan teks yang mahal untuk level yang tersaring sebaiknya dijaga dengan pemeriksaan level terlebih dahulu, dan pesan dibuat ringkas karena setiap baris tetap melewati antrean yang sama.

Ringkasan#

  • Logger menyediakan delapan level terurut, dengan fungsi pencatatan bernama sama seperti levelnya dan nilai kembaliannya selalu ok.
  • Level utama menyaring log sebelum handler, dan none mematikan seluruh keluaran.
  • Handler menentukan tujuan, formatter menentukan bentuk baris, dan metadata memperkaya log secara terstruktur.
  • Metadata per proses lewat logger:update_process_metadata/1 membawa konteks permanen pada seluruh log proses itu.

Referensi#