Simple Logging Facade for Java (SLF4J)
Simple Logging Facade for Java (SLF4J) ist eine externe Java-Bibliothek für strukturiertes Logging. Logging ist ein zentraler Bestandteil professioneller Softwareentwicklung und unterstützt bei Fehlerbehebung, Überwachung, Debugging und Leistungsanalyse. SLF4J ist eine Abstraktionsschicht (Fassade) und benötigt eine konkrete Logging-Implementierung, z.B. Log4J.
Protokollierungs-Level
SLF4J definiert fünf Protokollierungs-Level, die die Schwere oder Wichtigkeit einer Nachricht angeben.
| Level | Beschreibung |
|---|---|
| TRACE | Sehr detaillierte Informationen für die Fehlersuche (z.B. Methodenname) |
| DEBUG | Detaillierte Informationen für den Entwickler (z.B. Variablenwert) |
| INFO | Allgemeine Informationsmeldungen, die den normalen Betrieb der Anwendung beschreiben |
| WARN | Warnungen, die auf potenzielle Probleme hinweisen, die jedoch nicht sofort behoben werden müssen |
| ERROR | Fehler, die den normalen Betrieb der Anwendung beeinträchtigen und ggbfs. den sofortigen Abbruch der Anwendung erfordern |
Protokollierungs-Implementierungen
SLF4J selbst ist nur eine Fassade und führt keine Protokollierung durch. Für die tatsächliche Ausgabe ist eine konkrete Implementierung nötig. Eine der gebräuchlichsten ist Log4J, das Protokolle sowohl auf der Konsole als auch in Dateien ausgeben kann.
Beispiel
Die Klasse Names liest Namen aus einer Datei. Ein Logger protokolliert dabei
die wichtigsten Schritte und schreibt die Ausgaben in die Datei logs/app.log.
- Startklasse
- Log4J-Konfigurationsdatei
public class Names {
private final static Logger logger = LoggerFactory.getLogger(Names.class);
public static List<String> getNames(File file) throws IOException {
List<String> names = new ArrayList<>();
logger.info("Name list has been initialized successfully");
if (!file.exists()) {
logger.error("File {} does not exist", file);
throw new IOException();
}
Scanner scanner = new Scanner(file);
logger.info("File Scanner has been initialized successfully");
while (scanner.hasNextLine()) {
String name = scanner.nextLine();
logger.debug(name);
names.add(name);
}
logger.info("{} names have been read", names.size());
scanner.close();
logger.info("File {} has been closed successfully", file);
return names;
}
}
log4j.rootLogger=debug, file, console
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.file=logs/app.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n