Java Academy · Pelajaran

Mengapa Pengelogan Berstruktur

Melangkaui System.out.println

Pelajaran 1 daripada 413 langkah

Mengapa Pengelogan Berstruktur ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Masalah dengan Pencetakan Baris

System.out.println sesuai untuk percubaan pantas, tetapi merupakan alat pengelogan yang kurang baik untuk aplikasi sebenar.

  • Tiada cap masa, tahap atau nama utas.
  • Tiada cara untuk menyahdayakannya dalam persekitaran sebenar.
  • Hanya menulis kepada stdout tanpa penghalaan.
public class Main {
    public static void main(String[] args) {
        // Crude: no level, no timestamp, always on
        System.out.println("User logged in");
    }
}

Penambahan oleh Rangka Kerja Pengelogan

Rangka kerja pengelogan memberikan anda:

  • Tahap (TRACE, DEBUG, INFO, WARN, ERROR) untuk menapis gangguan.
  • Cap masa, utas dan nama pencatat secara automatik.
  • Penghalaan ke fail, konsol atau sistem jauh.
  • Konfigurasi semasa berjalan tanpa pengkompilan semula.
public class Main {
    public static void main(String[] args) {
        // A framework would render: time, level, logger, thread, message
        String simulated = "2026-01-01 10:00:00 INFO  c.e.App [main] - User logged in";
        System.out.println(simulated);
    }
}

Penjelasan Tahap Pengelogan

Tahap mengelaskan mesej mengikut kepentingan:

  • TRACE: perincian yang sangat halus.
  • DEBUG: diagnostik pembangunan.
  • INFO: peristiwa biasa.
  • WARN: sesuatu yang tidak dijangka tetapi boleh dipulihkan.
  • ERROR: kegagalan yang memerlukan perhatian.
public class Main {
    enum Level { TRACE, DEBUG, INFO, WARN, ERROR }
    public static void main(String[] args) {
        Level threshold = Level.INFO;
        for (Level l : Level.values()) {
            boolean shown = l.ordinal() >= threshold.ordinal();
            System.out.println(l + " visible? " + shown);
        }
    }
}

Penapisan Mengikut Ambang

Pencatat mempunyai ambang. Mesej di bawah ambang dibuang dengan kos yang rendah.

Dalam persekitaran sebenar, anda mungkin menetapkan INFO supaya DEBUG dan TRACE hilang, lalu mengurangkan gangguan dan kos tanpa perubahan kod.

public class Main {
    enum Level { TRACE, DEBUG, INFO, WARN, ERROR }
    static void log(Level threshold, Level level, String msg) {
        if (level.ordinal() >= threshold.ordinal()) {
            System.out.println(level + " - " + msg);
        }
    }
    public static void main(String[] args) {
        Level t = Level.WARN;
        log(t, Level.DEBUG, "hidden detail");
        log(t, Level.ERROR, "shown error");
    }
}

Berstruktur berbanding Tidak Berstruktur

Catatan tidak berstruktur ialah ayat biasa. Catatan berstruktur melampirkan konteks pasangan kunci-nilai (pengenal pengguna, pengenal permintaan) yang boleh dihuraikan oleh mesin.

Catatan berstruktur boleh dicari dan dikumpulkan dalam alat seperti Elasticsearch atau Loki.

import java.util.Map;

public class Main {
    public static void main(String[] args) {
        // Structured context as key-value pairs
        Map<String, Object> fields = Map.of("event", "login", "userId", 42, "ok", true);
        System.out.println(fields);
    }
}

Idea Fasad

Anda tidak sepatutnya mengikat kod anda kepada pustaka pengelogan tertentu. Fasad seperti SLF4J membolehkan anda menulis kod menggunakan satu antara muka dan menukar bahagian belakangnya (Logback, Log4j2) kemudian.

Ini menyahgandingkan aplikasi anda daripada pilihan pelaksanaan pengelogan.

public class Main {
    public static void main(String[] args) {
        // Concept: your code calls a facade interface, not a concrete logger
        System.out.println("App -> SLF4J facade -> Logback backend");
    }
}

Mengapa Tidak Menggunakan Bendera Boolean Sahaja

Sesetengah kod menggunakan if (DEBUG) System.out.println(...). Ini memenuhi pangkalan kod dengan kod tambahan dan tidak menyediakan kawalan mengikut pakej.

Rangka kerja pengelogan memusatkan konfigurasi: dayakan DEBUG untuk satu pakej dan ERROR untuk semua yang lain.

public class Main {
    static final boolean DEBUG = false;
    public static void main(String[] args) {
        // Inflexible: one global switch, scattered checks
        if (DEBUG) System.out.println("diagnostic");
        System.out.println("A framework controls this per logger instead");
    }
}

Pertimbangan Prestasi

Pengelogan sepatutnya murah apabila dinyahdayakan. Rangka kerja melangkau kerja untuk tahap yang ditapis, manakala mesej berparameter mengelakkan pembinaan rentetan yang akan dibuang.

println sentiasa menilai hujahnya, walaupun tiada sesiapa membaca output.

public class Main {
    static String expensive() {
        System.out.println("(building expensive string)");
        return "big report";
    }
    public static void main(String[] args) {
        boolean debugEnabled = false;
        // Only build the message if it will actually be logged
        if (debugEnabled) System.out.println(expensive());
        System.out.println("skipped expensive work");
    }
}

Penghalaan Output Berpusat

Rangka kerja menghantar catatan kepada satu atau lebih penghantar: konsol, fail berputar, catatan sistem atau pengumpul rangkaian.

Anda mengkonfigurasikan penghalaan sekali sahaja; kod aplikasi kekal sama.

public class Main {
    public static void main(String[] args) {
        String[] appenders = {"CONSOLE", "ROLLING_FILE", "JSON_HTTP"};
        for (String a : appenders) System.out.println("route logs to: " + a);
    }
}

Hubungan dan Konteks

Sistem sebenar menambahkan pengenal permintaan pada setiap baris catatan dalam sesuatu permintaan, supaya anda boleh menjejaki perjalanan seorang pengguna merentas utas dan perkhidmatan.

SLF4J menyokongnya melalui MDC (Konteks Diagnostik Dipetakan).

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, String> mdc = new HashMap<>();
        mdc.put("requestId", "req-1234");
        System.out.println("All logs in this request tagged with " + mdc);
    }
}

Rancangan

Sepanjang kursus ini anda akan:

  • Menggunakan fasad SLF4J dan mendapatkan pencatat.
  • Mencatat pada tahap yang betul.
  • Menggunakan mesej berparameter untuk kecekapan.
  • Konfigurasikan Logback dengan penghantar dan corak.
public class Main {
    public static void main(String[] args) {
        System.out.println("Next: SLF4J facade and loggers");
    }
}

Semakan Pantas

Uji pemahaman Anda tentang pengelogan berstruktur.

Imbas Kembali

Anda telah mempelajari sebab pengelogan berstruktur penting:

  • println tidak mempunyai tahap, metadata dan penghalaan.
  • Rangka kerja menambahkan tahap, penapisan dan penyalur.
  • Fasad menyahgandingkan kod daripada sistem belakang.
  • Konteks berstruktur dan MDC membolehkan korelasi.

Seterusnya, fasad SLF4J dan penciptaan Logger.

public class Main {
    public static void main(String[] args) {
        System.out.println("Structured logging recap complete");
    }
}
Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “Mengapa Pengelogan Berstruktur” percuma?

Ya — teks penuh “Mengapa Pengelogan Berstruktur” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mengapa Pengelogan Berstruktur”?

Melangkaui System.out.println Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Mengapa Pengelogan Berstruktur” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mengapa Pengelogan Berstruktur
  2. Fasad SLF4J dan Pengelog
  3. Pengelogan Berparameter
  4. Mengkonfigurasi Logback
← Kembali ke Java Academy