Inleiding tot SLF4J

1. Overzicht

Simple Logging Facade for Java (afgekort SLF4J) - fungeert als een façade voor verschillende logging-frameworks (bijv. Java.util.logging, logback, Log4j). Het biedt een generieke API die de logging onafhankelijk maakt van de daadwerkelijke implementatie.

Hierdoor kunnen verschillende logging-frameworks naast elkaar bestaan. Het helpt ook bij het migreren van het ene raamwerk naar het andere. Ten slotte biedt het naast gestandaardiseerde API ook wat "syntactische suiker".

Dit artikel bespreekt de afhankelijkheden en configuratie die nodig zijn om SLF4J te integreren met Log4j2, Logback, Log4J2 en Jakarta Commons Logging. Meer over elk van deze implementaties kunt u lezen in het artikel Inleiding tot Java-logboekregistratie.

2.De Log4j2-installatie

Om SLF4J met Log4j2 te gebruiken, moet u de volgende bibliotheken toevoegen aan pom.xml:

 org.apache.logging.log4j log4j-api 2.7 org.apache.logging.log4j log4j-core 2.7 org.apache.logging.log4j log4j-slf4j-impl 2.7 

De laatste versie is hier te vinden: log4j-api, log4j-core, log4j-slf4j-impl.

De feitelijke logboekconfiguratie is in overeenstemming met de native Log4j 2-configuratie. Laten we eens kijken hoe de Logger instantie is gemaakt:

openbare klasse SLF4JExample {privé statische Logger-logger = LoggerFactory.getLogger (SLF4JExample.class); public static void main (String [] args) {logger.debug ("Debug logbericht"); logger.info ("Info logbericht"); logger.error ("Foutenlogboekbericht"); }}

Merk op dat de Logger en LoggerFactory behoren tot de org.slf4j pakket. Een voorbeeld van een project dat draait met de verklaarde configuratie is hier beschikbaar.

3.De Logback-instellingen

Om SLF4J met Logback te gebruiken, hoeft u SLF4J niet aan uw klassenpad toe te voegen. Logback maakt al gebruik van SLF4J. Het wordt beschouwd als de referentie-implementatie. We hoeven alleen de Logback-bibliotheek op te nemen:

 ch.qos.logback logback-classic 1.1.7 

De laatste versie is hier te vinden: logback-classic.

De configuratie is Logback-specifiek maar werkt naadloos samen met SLF4J. Met de juiste afhankelijkheden en configuratie kan dezelfde code uit vorige secties worden gebruikt om de logboekregistratie af te handelen.

4.De Log4j Setup

In de vorige secties hebben we een use-case behandeld waarbij SLF4J bovenop de specifieke logging-implementatie zit. Op deze manier gebruikt, abstraheert het het onderliggende raamwerk volledig.

Er zijn gevallen waarin een bestaande logging-oplossing niet kan worden vervangen, bijv. vanwege vereisten van derden. Dit betekent echter niet dat het project alleen wordt “veroordeeld” tot het reeds gebruikte raamwerk.

SLF4J kan worden geconfigureerd als een bridge, waar de oproepen naar een bestaand framework ernaar worden doorgestuurd. Laten we de nodige afhankelijkheden toevoegen om een ​​brug voor Log4j te maken:

 org.slf4j log4j-over-slf4j 1.7.30 

Met de afhankelijkheid op zijn plaats (controleer voor laatste op log4j-over-slf4j), zullen alle oproepen naar Log4j worden omgeleid naar SLF4J. Bekijk de officiële documentatie voor meer informatie over het overbruggen van bestaande frameworks.

Net als bij de andere frameworks kan Log4j dienen als onderliggende implementatie. Laten we de nodige afhankelijkheden toevoegen:

 org.slf4j slf4j-log4j12 1.7.30 log4j log4j 1.2.17 

De laatste versie is hier te vinden voor slf4j-log4j12 en log4j. Een voorbeeldproject, geconfigureerd op de beschreven manier, is hier beschikbaar.

5.JCL Bridge-installatie

In de vorige paragrafen hebben we laten zien hoe dezelfde codebasis kan worden gebruikt om logboekregistratie met verschillende implementaties te ondersteunen. Hoewel dit de belangrijkste belofte en kracht is van SLF4J, is het ook het doel achter JCL (Jakarta Commons Logging of Apache Commons Logging).

JCL is, door zijn bedoelingen, een raamwerk vergelijkbaar met SLF4J. Het belangrijkste verschil is dat JCL de onderliggende implementatie tijdens de uitvoeringstijd oplost via een class-laadsysteem. Deze benadering wordt als problematisch ervaren in gevallen waarin er aangepaste classloaders in het spel zijn.

SLF4J lost de bindingen op tijdens het compileren. Het wordt als eenvoudiger maar krachtig genoeg ervaren.

Gelukkig kunnen twee frameworks samenwerken in de bridge-modus:

 org.slf4j jcl-over-slf4j 1.7.30 

De laatste afhankelijkheidsversie is hier te vinden jcl-over-slf4j.

Net als bij de andere gevallen, werkt dezelfde codebasis prima. Een voorbeeld van een compleet project met deze setup is hier beschikbaar.

6. Verder SLF4J Goedheid

SLF4J biedt extra dat het loggen efficiënter kan maken en de code beter leesbaar kan maken. SLF4J biedt bijvoorbeeld een zeer nuttige interface voor het werken met parameters:

String variable = "Hallo John"; logger.debug ("Variabele waarde afdrukken: {}", variabele);

Hier is het codevoorbeeld van Log4j dat hetzelfde doet:

String variable = "Hallo John"; logger.debug ("Variabele waarde afdrukken:" + variabele);

Zoals u kunt zien, zal Log4j aaneenschakelen Snaren los van debuggen niveau wordt ingeschakeld of niet. In toepassingen met hoge belasting kan dit prestatieproblemen veroorzaken. SLF4J wordt samengevoegd Snaren alleen als de debuggen niveau is ingeschakeld. Om hetzelfde te doen met Log4J moet u extra toevoegen als blok dat zal controleren of debuggen niveau is ingeschakeld of niet:

String variable = "Hallo John"; if (logger.isDebugEnabled ()) {logger.debug ("Variabele waarde afdrukken:" + variabele); }

SLF4J heeft de logboekregistratieniveaus gestandaardiseerd die verschillend zijn voor de specifieke implementaties. De FATAAL logging-niveau is gedaald (het werd geïntroduceerd in Log4j) gebaseerd op de premisse dat we in een logging-framework niet moeten beslissen wanneer een applicatie moet worden beëindigd.

De gebruikte logboekniveaus zijn FOUT, WAARSCHUWING, INFO, DEBUG, TRACE. U kunt meer lezen over het gebruik ervan in het artikel Inleiding tot Java-logboekregistratie.

7. Conclusie

SLF4J helpt bij het geruisloos schakelen tussen logging-frameworks. Het is eenvoudig, maar toch flexibel, en zorgt voor leesbaarheid en prestatieverbeteringen.

Zoals gewoonlijk is de code te vinden op GitHub. Bovendien verwijzen we naar twee andere projecten die zijn gewijd aan verschillende artikelen, maar met besproken logboekconfiguraties, hier en hier.