0Pricing
Java Academy · Pelajaran

Logging Berparameter

Pemformatan pesan yang efisien.

Logging Berparameter adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Masalah Penggabungan String

Menggabungkan pesan pencatatan akan membuat seluruh String sebelum pemanggilan, meskipun tingkatnya dinonaktifkan.

log.debug("id=" + id + " name=" + name) membuang CPU saat DEBUG nonaktif karena String tetap dibuat.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        String name = "Ada"; int id = 7;
        // Bad: string is built even if DEBUG is disabled
        log.debug("id=" + id + " name=" + name);
    }
}

Penanda Tempat dengan {}

SLF4J menggunakan {} sebagai penanda tempat. Teruskan nilainya sebagai argumen tambahan.

Pesan hanya dirangkai jika tingkatnya diaktifkan, sehingga pencatatan yang dinonaktifkan hampir tidak memerlukan biaya.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        String name = "Ada"; int id = 7;
        // Good: no string built unless DEBUG is on
        log.debug("id={} name={}", id, name);
    }
}

Beberapa Penanda Tempat

Penanda tempat diisi secara berurutan. {} pertama menerima argumen pertama, yang kedua menerima argumen kedua, dan seterusnya.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        log.info("order {} for user {} totaling {} cents", "A-1", 42, 1599);
    }
}

Mengapa Ini Efisien

Kerangka kerja terlebih dahulu memeriksa tingkatnya. Jika nonaktif, kerangka kerja segera kembali tanpa memanggil toString() pada argumen apa pun.

Bagian yang mahal, yaitu pemformatan, dilakukan secara tertunda hanya ketika pesan benar-benar akan dikeluarkan.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    static String describe(Object o) { System.out.println("toString called"); return o.toString(); }
    public static void main(String[] args) {
        // Note: passing describe(...) still evaluates eagerly; pass the raw object instead
        log.trace("value={}", new int[]{1, 2, 3});
    }
}

Teruskan Objek Mentah, Bukan String yang Sudah Diformat

Untuk mendapatkan manfaat penundaan, teruskan objek mentah, bukan pemanggilan metode yang memformatnya.

Jika Anda menulis log.debug("{}", buildReport()), buildReport() tetap dijalankan segera. Teruskan argumen yang dapat diformat sendiri oleh logger.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        Object user = new Object();
        // Logger calls user.toString() only if DEBUG is enabled
        log.debug("current user: {}", user);
    }
}

Pemasok Tertunda untuk Pekerjaan Berat

Jika pemformatan benar-benar mahal, gunakan antarmuka lancar SLF4J 2.x dengan Supplier agar pekerjaan ditunda.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    static String heavyReport() { return "...expensive..."; }
    public static void main(String[] args) {
        log.atDebug()
           .setMessage("report: {}")
           .addArgument(() -> heavyReport())
           .log();
    }
}

Meloloskan Kurung Kurawal Harfiah

Jika Anda memerlukan {} harfiah dalam pesan, lepaskan maknanya dengan garis miring terbalik: \\{}.

Hal ini jarang diperlukan, tetapi berguna saat mencatat teks mirip JSON.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        // Logs a literal {} then the value
        log.info("empty object is \\{} and id is {}", 7);
    }
}

Pengecualian Ditambah Penanda Tempat

Anda dapat menggabungkan penanda tempat dengan pengecualian di bagian akhir. SLF4J mendeteksi bahwa argumen terakhir adalah Throwable dan mencetak jejak tumpukannya.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        int id = 99;
        try {
            throw new RuntimeException("db down");
        } catch (Exception e) {
            log.error("failed processing record {}", id, e);
        }
    }
}

Hindari Terlalu Banyak Argumen

Jika jumlah penanda tempat dan jumlah argumen tidak sesuai, SLF4J akan berusaha sebaik mungkin, tetapi keluarannya mungkin terlihat keliru.

Pastikan keduanya tetap sesuai. Untuk lebih dari beberapa nilai, pertimbangkan konteks terstruktur (MDC).

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        // Two placeholders, two arguments: correct
        log.info("user {} did {}", "ada", "login");
    }
}

Menambahkan Konteks dengan MDC

Untuk nilai yang digunakan bersama di banyak baris (seperti ID permintaan), masukkan nilai tersebut ke dalam MDC, bukan ke setiap pesan.

Tata letak pola kemudian dapat mencetak nilai MDC di setiap baris secara otomatis.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        MDC.put("requestId", "req-1234");
        try {
            log.info("handling request");
            log.info("request done");
        } finally {
            MDC.clear();
        }
    }
}

Ringkasan Praktik Terbaik

Aturan untuk pencatatan yang efisien:

  • Selalu gunakan penanda tempat {}, jangan pernah penggabungan dengan +.
  • Teruskan objek mentah, bukan String yang telah dibuat sebelumnya.
  • Gunakan pemasok atau isXEnabled() untuk pekerjaan yang benar-benar berat.
  • Gunakan MDC untuk konteks lintas fungsi.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        log.info("processed {} items in {} ms", 1000, 42);
    }
}

Pemeriksaan Singkat

Uji pengetahuan Anda tentang pencatatan berparameter.

Ringkasan

Anda telah mempelajari pencatatan berparameter:

  • Gunakan penanda tempat {} dengan argumen tambahan.
  • Pesan dibuat secara tertunda, hanya ketika tingkatnya aktif.
  • Teruskan objek mentah; gunakan pemasok untuk pekerjaan berat.
  • Gunakan MDC untuk nilai kontekstual yang digunakan bersama.

Berikutnya, mengonfigurasi sistem pendukung Logback.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        log.info("Parameterized logging recap: {}", "done");
    }
}

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Logging Berparameter” gratis?

Ya — teks lengkap “Logging Berparameter” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Logging Berparameter”?

Pemformatan pesan yang efisien. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Logging Berparameter” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengapa Logging Terstruktur
  2. Facade SLF4J dan Logger
  3. Logging Berparameter
  4. Mengonfigurasi Logback
← Kembali ke Java Academy