SLF4J-facade og loggere
Log på det rette niveau
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 Loggerpr. klasse. - Brug de fem niveau-metoder på passende vis.
- Loggernavne er hierarkiske, så du kan styre dem pr. pakke.
- Angiv en
Throwablesidst 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");
}
}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
- Hvorfor structured logging
- SLF4J-facade og loggere
- Parameteriseret logging
- Konfiguration af Logback