Java Academy · Lektion

Hvorfor structured logging

Mere end System.out.println

Lektion 1 af 413 trin

Hvorfor structured logging er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Problemet med println

System.out.println er fint til et hurtigt eksperiment, men det er et dårligt værktøj til logning i rigtige applikationer.

  • Ingen tidsstempler, niveauer eller trådnavne.
  • Ingen mulighed for at slå det fra i produktion.
  • Skriver kun til stdout uden nogen form for dirigering.
public class Main {
    public static void main(String[] args) {
        // Crude: no level, no timestamp, always on
        System.out.println("User logged in");
    }
}

Hvad logningsrammer tilføjer

En logningsramme giver dig:

  • Niveauer (TRACE, DEBUG, INFO, WARN, ERROR) til at filtrere støj.
  • Tidsstempler, tråd- og logningsnavne automatisk.
  • Dirigering til filer, konsollen eller fjernsystemer.
  • Køretidskonfiguration uden genkompilering.
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);
    }
}

Forklaring af logningsniveauer

Niveauer rangerer meddelelser efter vigtighed:

  • TRACE: meget detaljerede oplysninger.
  • DEBUG: udviklingsdiagnostik.
  • INFO: normale milepæle.
  • WARN: noget uventet, men håndterbart.
  • ERROR: en fejl, der kræver opmærksomhed.
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 efter tærskel

En logningsinstans har en tærskel. Meddelelser under tærsklen kasseres med lave omkostninger.

I produktion kan du sætte tærsklen til INFO, så DEBUG og TRACE forsvinder, hvilket reducerer støj og omkostninger uden kodeændringer.

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

Strukturerede kontra ustrukturerede

Ustrukturerede logmeddelelser er almindelige sætninger. Strukturerede logmeddelelser knytter kontekst i form af nøgle-værdi-par (bruger-id, anmodnings-id), som maskiner kan fortolke.

Strukturerede logmeddelelser kan søges i og sammenfattes ved hjælp af værktøjer som Elasticsearch og 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);
    }
}

Facademønsteret

Du bør ikke binde din kode til et bestemt logningsbibliotek. En facade som SLF4J lader dig skrive kode mod én API og senere udskifte den bagvedliggende implementering (Logback, Log4j2).

Det afkobler din applikation fra valg af logningsimplementering.

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 bruge et boolesk flag?

Nogle programmer bruger if (DEBUG) System.out.println(...). Det spreder sig i hele kodebasen og giver ingen kontrol pr. pakke.

En logningsramme centraliserer konfigurationen: aktivér DEBUG for én pakke og ERROR for alt andet.

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

Ydelsesovervejelser

Logning bør have lave omkostninger, når den er deaktiveret. Rammer springer arbejdet over for filtrerede niveauer, og parametriserede meddelelser undgår at opbygge strenge, som du alligevel kasserer.

println evaluerer altid sit argument, selv hvis ingen læser outputtet.

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

Centraliseret dirigering af output

Rammer sender logmeddelelser til en eller flere appendere: konsollen, roterende filer, syslog eller en netværksindsamler.

Du konfigurerer dirigeringen én gang, mens applikationskoden forbliver den samme.

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

Korrelation og kontekst

Rigtige systemer føjer et anmodnings-id til hver loglinje i en anmodning, så du kan følge én brugers forløb på tværs af tråde og tjenester.

SLF4J understøtter dette via MDC (tilknyttet diagnostisk kontekst).

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øbet af dette kursus vil du:

  • Bruge SLF4J-facaden og hente logningsinstanser.
  • Logge på det rigtige niveau.
  • Bruge parametriserede meddelelser for at opnå 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");
    }
}

Hurtigt tjek

Test din forståelse af struktureret logning.

Opsummering

Du lærte, hvorfor struktureret logning er vigtig:

  • println mangler niveauer, metadata og videresendelse.
  • Frameworks tilføjer niveauer, filtrering og appendere.
  • En facade afkobler koden fra backendet.
  • Struktureret kontekst og MDC gør korrelation mulig.

Næste emne er SLF4J-facaden og oprettelse af loggere.

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

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “Hvorfor structured logging” gratis?

Ja — hele teksten til “Hvorfor structured logging” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Hvorfor structured logging”?

Mere end System.out.println Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Hvorfor structured logging”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvorfor structured logging
  2. SLF4J-facade og loggere
  3. Parameteriseret logging
  4. Konfiguration af Logback
← Tilbage til Java Academy