logo

Log4j vs SLF4J

SLF4J (Simple Logging Fa�ade för java) är ett API utformat för att ge generisk tillgång till många loggningsramverk, log4j är ett av dem.

Det är i grunden ett abstraktionslager. Det är inte en loggningsimplementering. Det betyder att om du skriver ett bibliotek och du använder SLF4J, kan du ge det biblioteket till någon annan att använda och de kan välja vilken loggningsimplementering som ska användas med SLF4J, t.ex. log4j eller Java logging API. Det används för att förhindra att applikationer är beroende av olika loggnings-API:er precis som de använder bibliotek som är beroende av dem.

Men vi utvecklar skillnaden mellan Log4J och SLF4J som bara förtjänar ett radsvar. dvs frågan i sig är fel. SLF4J och Log4J är olika, eller så är de inte lika komponenter. Som namnet specificerat är SLF4J en enkel loggningsfasad för java. Det är inte en loggningskomponent, och inte ens den gör själva loggningen. Det är bara ett abstraktionslager till en underliggande loggningskomponent.

I fallet med Log4j , det är en loggningskomponent och den gör den loggning som instruerats att göra. Så vi kan säga att SLF4J och Log4J logiskt sett är två olika saker.

Log4j vs SLF4J

Nu behöver du bara välja vilket loggningsramverk du behöver använda under körning. För det måste du inkludera två jar-filer:

  • SLF4J bindande burkfil
  • Önskad loggningsram-jar-filer

Till exempel, för att använda log4j i ditt projekt, måste du inkludera nedanstående jar-filer:

  • slf4j-log4j12-1.7.12.jar
  • log4j-1.2.17.jar

När du har placerat båda jar-filerna i din applikations klasssökväg kommer SLF4J automatiskt att upptäcka den och börja använda log4j för att bearbeta loggsatserna baserat på konfigurationen du angav i log4j-konfigurationsfilen.

Till exempel, nedanstående kod kan du skriva i din projektklassfil:

 import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info('Hello World'); } } 

Varför är SLF4J bättre än Log4J?

Det är alltid svårt att föredra en mellan SLF4J och Log4j. Om du har ett val skulle jag föreslå dig; loggningsabstraktion är alltid att föredra än loggningsramverk. Om du använder en loggningsabstraktion, i synnerhet SLF4J, kan vi migrera till alla loggningsramverk som vi behöver vid tidpunkten för implementeringen utan att välja ett enda beroende.

Följande är skälen som är tillräckligt bra för att välja SLF4J framför Log4j:

  • Det är alltid bättre att använda abstraktion.
  • SLF4J är ett bibliotek med öppen källkod eller ett internt bibliotek som gör det oberoende av någon speciell loggningsimplementering, vilket innebär att man inte behöver hantera flera loggningskonfigurationer för flera bibliotek.
  • SLF4J tillhandahåller platshållarbaserad loggning, vilket förbättrar läsbarheten för kod genom att ta bort kontroller som isInforEnabled(), isDebugEnabled(), etc.
  • Genom att använda loggmetoden för SLF4J skjuter vi upp kostnaden för att konstruera loggmeddelanden (sträng), tills du behöver det, vilket är både CPU- och minneseffektivt.
  • Eftersom SLF4J använder färre antal tillfälliga strängar betyder det mindre arbete för sopsamlaren, vilket innebär bättre genomströmning och prestanda för din applikation.

Så i huvudsak ersätter SLF4J inte log4j; de båda arbetar tillsammans. Det tar bort beroendet av log4j från din applikation och gör det enkelt att ersätta det i framtiden med det mer kapabla biblioteket.