Java Academy · leksjon

SLF4J-fasade og loggere

Logg på riktig nivå

Leksjon 2 av 413 trinn

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

Hva er SLF4J?

SLF4J (Simple Logging Facade for Java) er en abstraksjon. Du skriver kode mot API-et, mens en backend som Logback eller Log4j2 utfører selve loggingen.

Dermed kan biblioteker logge uten å tvinge applikasjonen til å bruke en bestemt implementasjon.

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

Hente en logger

Opprett én logger per klasse med LoggerFactory.getLogger(MyClass.class).

Etter konvensjonen er feltet private static final og heter log eller logger. Klassen blir loggerens navn, og dette vises i utskriften.

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 nivåene

SLF4J-loggere tilbyr én metode per nivå:

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

Velge riktig nivå

Retningslinjer:

  • ERROR: en reell feil som et menneske må undersøke.
  • WARN: et avvik som kan håndteres.
  • INFO: viktige livssyklushendelser.
  • DEBUG: diagnostikk for utviklere, deaktivert i produksjon.
  • TRACE: svært detaljert 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);
    }
}

Loggernavn og hierarki

Loggernavn er hierarkiske basert på pakker adskilt med punktum. En logger med navnet com.example.svc er et barn av com.example.

Konfigurasjon på en overordnet logger gjelder for underordnede loggere med mindre den overstyres, slik at du kan angi nivåer per 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");
    }
}

Beskytte kostbare kall

Ved kostbar konstruksjon av meldinger bør du bruke isDebugEnabled() som beskyttelse, slik at arbeidet bare utføres når nivået er aktivt.

Med parameterisert logging (i neste leksjon) trenger du sjelden dette, men det er viktig når du bygger strenger selv.

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

Logge unntak

Hvis du vil logge et unntak med hele stacktracen, sender du Throwable som siste argument.

Ikke plasser unntaket i en plassholder; send det etter meldingen.

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 per klasse

Deklarer loggeren én gang som et statisk, final-felt. Opprett aldri en logger inne i en metode. Det er unødvendig arbeid og gjør at du mister fordelen ved å bruke klassenavnet.

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 backend

SLF4J er bare API-et. Ved kjøring kobles det til backend-implementasjonen som finnes på classpath.

  • Legg til logback-classic: SLF4J bruker Logback.
  • Legg til log4j-slf4j2-impl: SLF4J bruker Log4j2.

Koden din endres aldri.

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

Unngå logging av sensitive data

Logg aldri passord, token eller fullstendige kredittkortnumre. Logger sendes ofte til mange systemer og oppbevares lenge.

Masker eller utelat sensitive felt før du logger dem.

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

La oss sette det sammen: en liten tjeneste som logger på passende nivåer og har en bane for håndtering av unntak.

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

Kort sjekk

Test grunnleggende kunnskap om SLF4J.

Oppsummering

Du har lært om SLF4J-fasaden:

  • Hent én private static final Logger per klasse.
  • Bruk de fem nivåmetodene på riktig måte.
  • Loggernavn er hierarkiske, slik at du kan styre loggingen per pakke.
  • Send en Throwable sist for å logge stacktracer; logg aldri hemmeligheter.

Deretter ser vi på effektive parameteriserte meldinger.

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 å 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 «SLF4J-fasade og loggere» gratis?

Ja – hele teksten i «SLF4J-fasade og loggere» 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 «SLF4J-fasade og loggere»?

Logg på riktig nivå 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 2 av 4.

Hvor lang tid tar leksjonen «SLF4J-fasade og loggere»?

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