Java Academy · Lektion

SLF4J-facade og loggere

Log på det rette niveau

Lektion 2 af 413 trin

SLF4J-facade og loggere er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 2 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.

Hvad er SLF4J?

SLF4J (Simple Logging Facade for Java) er en abstraktion. Du skriver kode mod dens API, og et backend som Logback eller Log4j2 udfører den faktiske logning.

Det lader biblioteker logge uden at tvinge applikationen til at bruge en bestemt implementering.

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

Hent en logger

Opret én logger pr. klasse med LoggerFactory.getLogger(MyClass.class).

Efter konvention er feltet private static final og hedder log eller logger. Klassen bliver loggerens navn, som vises i logudskriften.

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

public class OrderService {
    private static final Logger log = LoggerFactory.getLogger(OrderService.class);
    void placeOrder(String id) {
        log.info("Placing order {}", id);
    }
}

De fem niveauer

SLF4J-loggere stiller én metode til rådighed pr. niveau:

  • log.trace(...)
  • log.debug(...)
  • log.info(...)
  • log.warn(...)
  • log.error(...)
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.trace("entering main");
        log.debug("args length = {}", args.length);
        log.info("service is up");
        log.warn("cache miss");
        log.error("failed to connect");
    }
}

Vælg det rigtige niveau

Retningslinjer:

  • ERROR: en reel fejl, som en person skal undersøge.
  • WARN: en afvigelse, der kan håndteres.
  • INFO: vigtige hændelser i livscyklussen.
  • DEBUG: diagnostik for udviklere, slået fra i produktion.
  • TRACE: ekstremt detaljeret sporing.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class PaymentService {
    private static final Logger log = LoggerFactory.getLogger(PaymentService.class);
    void charge(int cents) {
        if (cents <= 0) { log.warn("non-positive charge: {}", cents); return; }
        log.info("charged {} cents", cents);
    }
}

Loggernavne og hierarki

Loggernavne er hierarkiske efter pakker, der er adskilt af punktummer. En logger med navnet com.example.svc er underordnet com.example.

Konfiguration på en overordnet logger gælder for underordnede loggere, medmindre den tilsidesættes, så du kan angive niveauer pr. pakke.

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

public class Main {
    public static void main(String[] args) {
        Logger a = LoggerFactory.getLogger("com.example.app");
        Logger b = LoggerFactory.getLogger("com.example.app.db");
        a.info("parent logger");
        b.debug("child inherits parent's level unless overridden");
    }
}

Beskyt mod dyre kald

Ved dyr opbygning af meddelelser skal du bruge isDebugEnabled() som beskyttelse, så arbejdet kun udføres, når niveauet er aktivt.

Med parametriseret logning (i næste lektion) har du sjældent brug for dette, men det er vigtigt, når du selv bygger strenge.

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

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    static String heavyDump() { return "...large state..."; }
    public static void main(String[] args) {
        if (log.isDebugEnabled()) {
            log.debug("state: {}", heavyDump());
        }
    }
}

Logning af undtagelser

Hvis du vil logge en undtagelse med hele dens stacktrace, skal du angive Throwable som det sidste argument.

Sæt ikke undtagelsen i en pladsholder; angiv den efter meddelelsen.

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) {
        try {
            throw new IllegalStateException("boom");
        } catch (Exception e) {
            log.error("Operation failed for id {}", 42, e);
        }
    }
}

Én logger pr. klasse

Deklarer loggeren én gang som et statisk final-felt. Opret aldrig en logger inde i en metode, da det spilder arbejde og fjerner fordelen ved klassens navn.

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

public class UserRepository {
    // Good: one shared logger named after the class
    private static final Logger log = LoggerFactory.getLogger(UserRepository.class);
    void save(String user) { log.debug("saving {}", user); }
}

SLF4J kontra backendet

SLF4J er kun API'et. Ved kørsel bindes det til det backend, der findes på classpathen.

  • Tilføj logback-classic: SLF4J bruger Logback.
  • Tilføj log4j-slf4j2-impl: SLF4J bruger Log4j2.

Din kode ændres aldrig.

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) {
        // Same code, different backend depending on classpath
        log.info("backend-agnostic logging");
    }
}

Undgå at logge følsomme data

Log aldrig adgangskoder, tokens eller fulde kreditkortnumre. Logfiler sendes ofte til mange systemer og opbevares i lang tid.

Maskér eller udelad følsomme felter før logning.

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

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    static String mask(String card) { return "****" + card.substring(card.length() - 4); }
    public static void main(String[] args) {
        log.info("charged card {}", mask("4111111111111234"));
    }
}

En realistisk tjeneste

Her samler vi det hele: en lille tjeneste, der logger på passende niveauer og har en undtagelsessti.

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

public class EmailService {
    private static final Logger log = LoggerFactory.getLogger(EmailService.class);
    void send(String to) {
        log.debug("preparing email to {}", to);
        try {
            if (to == null) throw new IllegalArgumentException("null recipient");
            log.info("email sent to {}", to);
        } catch (Exception e) {
            log.error("failed to send email", e);
        }
    }
}

Hurtigt tjek

Test din grundlæggende viden om SLF4J.

Opsummering

Du lærte SLF4J-facaden at kende:

  • Hent én private static final Logger pr. klasse.
  • Brug de fem niveau-metoder på passende vis.
  • Loggernavne er hierarkiske, så du kan styre dem pr. pakke.
  • Angiv en Throwable sidst for at logge stacktraces, og log aldrig hemmeligheder.

Næste emne er effektive parametriserede meddelelser.

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("SLF4J facade 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 “SLF4J-facade og loggere” gratis?

Ja — hele teksten til “SLF4J-facade og loggere” 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 “SLF4J-facade og loggere”?

Log på det rette niveau 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 2 af 4.

Hvor lang tid tager lektionen “SLF4J-facade og loggere”?

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