Java Academy · Oppitunti

Miksi rakenteinen lokitus

System.out.printlnia pidemmälle.

Oppitunti 1/413 vaihetta

Miksi rakenteinen lokitus on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

printlnin ongelma

System.out.println sopii nopeaan kokeiluun, mutta se on huono lokitustyökalu oikeissa sovelluksissa.

  • Ei aikaleimoja, tasoja tai säikeiden nimiä.
  • Ei tapaa poistaa sitä käytöstä tuotannossa.
  • Kirjoittaa vain stdout-virtaan ilman reititystä.
public class Main {
    public static void main(String[] args) {
        // Crude: no level, no timestamp, always on
        System.out.println("User logged in");
    }
}

Mitä lokituskehykset tarjoavat

Lokituskehys tarjoaa seuraavat ominaisuudet:

  • Lokitasot (TRACE, DEBUG, INFO, WARN, ERROR), joilla kohinaa voi suodattaa.
  • Aikaleimat sekä säikeen ja lokittimen nimet automaattisesti.
  • Reititys tiedostoihin, konsoliin tai etäjärjestelmiin.
  • Ajonaikaiset asetukset ilman uudelleenkääntämistä.
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);
    }
}

Lokitasot selitetty

Lokitasot järjestävät viestit tärkeyden mukaan:

  • TRACE: erittäin yksityiskohtaiset tiedot.
  • DEBUG: kehityksen diagnostiikkatiedot.
  • INFO: normaalit virstanpylväät.
  • WARN: odottamaton mutta korjattavissa oleva tilanne.
  • ERROR: huomiota vaativa virhe.
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);
        }
    }
}

Suodatus kynnysarvon perusteella

Lokittimella on kynnysarvo. Sen alittavat viestit hylätään pienin kustannuksin.

Tuotannossa voitte asettaa tasoksi INFO, jolloin DEBUG- ja TRACE-viestit jäävät pois. Näin kohina ja kustannukset vähenevät ilman koodimuutoksia.

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");
    }
}

Rakenteinen ja rakenteeton lokitus

Rakenteettomat lokit ovat tavallisia lauseita. Rakenteiset lokit sisältävät avain–arvo-muotoista kontekstia, kuten käyttäjätunnisteen ja pyyntötunnisteen, jonka koneet voivat jäsentää.

Rakenteisia lokeja voi hakea ja yhdistellä työkaluilla, kuten Elasticsearchilla tai Lokilla.

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);
    }
}

Fasadin idea

Omaa koodia ei kannata sitoa tiettyyn lokituskirjastoon. SLF4J:n kaltainen fasadi mahdollistaa koodaamisen yhden rajapinnan kautta ja taustajärjestelmän, kuten Logbackin tai Log4j2:n, vaihtamisen myöhemmin.

Näin sovellus irrotetaan lokituksen toteutusratkaisuista.

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");
    }
}

Miksei vain käytetä boolean-lippua?

Jotkin koodit käyttävät rakennetta if (DEBUG) System.out.println(...). Tämä levittää ehtoja kaikkialle koodikantaan eikä tarjoa pakettikohtaista hallintaa.

Lokituskehys keskittää asetukset: DEBUG voidaan ottaa käyttöön yhdessä paketissa ja ERROR kaikissa muissa.

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");
    }
}

Suorituskykyyn liittyvät näkökohdat

Lokituksen pitäisi olla edullista, kun se ei ole käytössä. Kehykset ohittavat suodatettujen tasojen käsittelyn, ja parametroidut viestit estävät turhaan luotavien merkkijonojen muodostamisen.

println arvioi argumenttinsa aina, vaikka kukaan ei lukisi tulostetta.

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");
    }
}

Keskitetty lokien reititys

Kehykset lähettävät lokit yhteen tai useampaan appenderiin: konsoliin, kierrätettäviin lokitiedostoihin, syslogiin tai verkkokerääjään.

Reititys määritetään kerran, ja sovelluskoodi pysyy ennallaan.

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);
    }
}

Korrelaatio ja konteksti

Oikeat järjestelmät lisäävät jokaiseen pyynnön lokiriviin pyyntötunnisteen, jotta yhden käyttäjän toimintaketjua voidaan seurata säikeiden ja palvelujen läpi.

SLF4J tukee tätä MDC:n (Mapped Diagnostic Context) avulla.

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);
    }
}

Suunnitelma

Tämän kurssin aikana:

  • Käytätte SLF4J-fasadia ja hankitte lokittimet.
  • Kirjaatte lokit oikealla tasolla.
  • Käytätte tehokkaita parametroituja viestejä.
  • Määritätte Logbackin appendereineen ja kuvioineen.
public class Main {
    public static void main(String[] args) {
        System.out.println("Next: SLF4J facade and loggers");
    }
}

Pikatarkistus

Testatkaa rakenteisen lokituksen ymmärrystänne.

Kertaus

Opitte, miksi rakenteinen lokitus on tärkeää:

  • println-komennosta puuttuvat tasot, metatiedot ja reititys.
  • Frameworkit lisäävät tasot, suodatuksen ja appenderit.
  • Julkisivu irrottaa koodin taustajärjestelmästä.
  • Rakenteinen konteksti ja MDC mahdollistavat korrelaation.

Seuraavaksi tutustutaan SLF4J-julkisivuun ja loggerien luomiseen.

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

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Miksi rakenteinen lokitus” ilmainen?

Kyllä – oppitunnin ”Miksi rakenteinen lokitus” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Miksi rakenteinen lokitus”?

System.out.printlnia pidemmälle. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Miksi rakenteinen lokitus”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Miksi rakenteinen lokitus
  2. SLF4J-julkisivu ja lokittimet
  3. Parametrisoitu lokitus
  4. Logbackin määrittäminen
← Takaisin: Java Academy