Java Academy · leksjon

Hvorfor strukturert logging

Mer enn System.out.println

Leksjon 1 av 413 trinn

Hvorfor strukturert logging er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Problemet med println

System.out.println er fint for et raskt eksperiment, men er et dårlig loggingsverktøy i virkelige applikasjoner.

  • Ingen tidsstempler, nivåer eller trådnavn.
  • Ingen måte å slå det av i produksjon på.
  • Skriver bare til stdout, uten ruting.
public class Main {
    public static void main(String[] args) {
        // Crude: no level, no timestamp, always on
        System.out.println("User logged in");
    }
}

Hva loggingsrammeverk tilfører

Et loggingsrammeverk gir Dem:

  • Nivåer (TRACE, DEBUG, INFO, WARN, ERROR) for å filtrere støy.
  • Tidsstempler, tråd- og loggernavn automatisk.
  • Ruting til filer, konsollen eller eksterne systemer.
  • Konfigurasjon under kjøring uten rekompilering.
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);
    }
}

Loggnivåer forklart

Nivåene rangerer meldinger etter viktighet:

  • TRACE: svært detaljert informasjon.
  • DEBUG: diagnostikk for utvikling.
  • INFO: normale milepæler.
  • WARN: noe uventet, men som kan håndteres.
  • ERROR: en feil som krever oppmerksomhet.
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);
        }
    }
}

Filtrering etter terskel

En logger har en terskel. Meldinger under terskelen forkastes med liten kostnad.

I produksjon kan De angi INFO, slik at DEBUG og TRACE forsvinner. Dermed reduseres støy og kostnader uten kodeendringer.

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

Strukturerte kontra ustrukturerte logger

Ustrukturerte logger er vanlige setninger. Strukturerte logger legger til kontekst i form av nøkkel-verdi-par (bruker-ID, forespørsels-ID) som maskiner kan tolke.

Strukturerte logger kan søkes i og aggregeres i verktøy som Elasticsearch eller 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);
    }
}

Ideen om en fasade

De bør ikke binde koden til et bestemt loggingsbibliotek. En fasade som SLF4J lar Dem programmere mot ett API og bytte backend (Logback, Log4j2) senere.

Dette kobler applikasjonen fra valgene av loggingsimplementasjon.

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

Hvorfor ikke bare bruke et boolsk flagg?

Noe kode bruker if (DEBUG) System.out.println(...). Dette sprer seg i hele kodebasen og gir ingen kontroll per pakke.

Et loggingsrammeverk sentraliserer konfigurasjonen: aktiver DEBUG for én pakke og ERROR for alt annet.

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

Ytelseshensyn

Logging bør ha liten kostnad når den er deaktivert. Rammeverk hopper over arbeid for filtrerte nivåer, og parameteriserte meldinger unngår å bygge strenger som De likevel forkaster.

println evaluerer alltid argumentet, selv om ingen leser utdataene.

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

Sentralisert utdata-ruting

Rammeverk sender logger til én eller flere appendere: konsollen, rullerende filer, syslog eller en nettverksbasert innsamler.

De konfigurerer rutingen én gang, mens applikasjonskoden forblir uendret.

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

Korrelasjon og kontekst

Virkelige systemer legger til en forespørsels-ID i hver logglinje for en forespørsel, slik at De kan spore én brukers forløp på tvers av tråder og tjenester.

SLF4J støtter dette gjennom MDC (Mapped Diagnostic Context).

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

Planen

I løpet av kurset skal De:

  • Bruke SLF4J-fasaden og hente loggere.
  • Logge på riktig nivå.
  • Bruke parameteriserte meldinger for bedre effektivitet.
  • Konfigurere Logback med appendere og mønstre.
public class Main {
    public static void main(String[] args) {
        System.out.println("Next: SLF4J facade and loggers");
    }
}

Kort sjekk

Test forståelsen din av strukturert logging.

Oppsummering

Du har lært hvorfor strukturert logging er viktig:

  • println mangler nivåer, metadata og ruting.
  • Rammeverk legger til nivåer, filtrering og appendere.
  • En fasade kobler koden fra backend-implementasjonen.
  • Strukturert kontekst og MDC muliggjør korrelasjon.

Deretter ser vi på SLF4J-fasaden og hvordan du oppretter loggere.

public class Main {
    public static void main(String[] args) {
        System.out.println("Structured logging recap complete");
    }
}
Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Hvorfor strukturert logging» gratis?

Ja – hele teksten i «Hvorfor strukturert logging» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Hvorfor strukturert logging»?

Mer enn System.out.println Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Hvorfor strukturert logging»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Hvorfor strukturert logging
  2. SLF4J-fasade og loggere
  3. Parameterisert logging
  4. Konfigurere Logback
← Tilbake til Java Academy