Log4j 2 Eksempel på bedste praksis
Logning er en kritisk funktion i enhver applikation. I dette selvstudie vil vi dække nogle Log4j2 bedste praksis, der kan hjælpe udviklere med at komme i gang og forbedre logningen med Log4j2.
1. Introduktion
Udskrivning af beskeder til konsollen er en integreret del af udviklingstesten og fejlretningen af et Java-program. Hvis udviklere arbejder på en serversideapplikation, hvor de ikke kan se, hvad der foregår inde på serveren, så er deres eneste synlighedsværktøj en log fil.
Uden logfiler kan udviklere ikke foretage nogen fejlfinding eller se, hvad der foregår inde i applikationen. Selvom Java har ret praktisk System.out.println()
metoder til at udskrive noget på konsollen, som også kan dirigeres til logfil, men ikke tilstrækkeligt til en virkelig Java-applikation.
Hvis udviklere kører et Java-program i Linux- eller Unix-baserede systemer, Log4j
eller SLF4j
eller en hvilken som helst anden logningsramme tilbyder meget flere funktioner, fleksibilitet og forbedring af meddelelseskvalitet, hvilket ikke er muligt ved hjælp af System.out.println()
udsagn.
1.1 Hvad er Log4j2?
Log4j2 er den opdaterede version af det populære og indflydelsesrige Log4j-bibliotek, som er en enkel, fleksibel og hurtig Java-baseret logningsramme. Det er trådsikkert og understøtter internationalisering. Vi har hovedsageligt 3 komponenter at arbejde med Log4j
:
- Logger :Den bruges til at logge meddelelserne.
- Tillæg :Det bruges til at publicere logningsoplysningerne til destinationen som en fil, database, konsol osv.
- Layout :Det bruges til at formatere logoplysninger i forskellige stilarter.
1.1.1 Log4j2 Logger Class
Logger
klasse giver metoderne til logningsprocessen. Vi kan bruge LogManager.getLogger()
metode til at få Logger
objekt. Syntaksen er angivet nedenfor:
static Logger log = LogManager.getLogger(YourClassName.class);
Logger
klasse har 6 forskellige logningsmetoder, som bruges til at udskrive status for en applikation:
Beskrivelse | Metodesyntaks | |
---|---|---|
debug(Objektmeddelelse) | Det bruges til at udskrive beskeden med niveauet org.apache.logging.log4j.Level.DEBUG . Det er det laveste begrænsede logningsniveau. | offentlig void debug(Objektmeddelelse) |
info(Objektmeddelelse) | Det bruges til at udskrive meddelelsen med niveauet org.apache.logging.log4j.Level.INFO . Det er mere begrænset end DEBUG-logningsniveauet, og udviklere bør logge meddelelser, der er til et informativt formål. | offentlig ugyldig info(Objektmeddelelse) |
advarsel(Objektmeddelelse) | Det bruges til at udskrive meddelelsen med niveauet org.apache.logging.log4j.Level.WARN . Det er mere begrænset end INFO-logningsniveauet og bruges til at logge advarslen af meddelelser, dvs. forbindelsen mistet mellem klient og server, mistet databaseforbindelse osv. | offentlig void warn(Objektmeddelelse) |
fejl(Objektmeddelelse) | Det bruges til at udskrive meddelelsen med niveauet org.apache.logging.log4j.Level.ERROR . Det er mere begrænset end WARN-logningsniveauet og bruges til at logge fejl og undtagelser. | offentlig ugyldig fejl (Objektmeddelelse) |
fatal(Objektmeddelelse) | Det bruges til at udskrive meddelelsen med niveauet org.apache.logging.log4j.Level.FATAL . | offentlig ugyldig fatal(Objektmeddelelse) |
trace(Objektmeddelelse) | Det bruges til at udskrive meddelelsen med niveauet org.apache.logging.log4j.Level.TRACE . | offentlig ugyldig sporing (Objektmeddelelse) |
For at opsummere er prioritetsniveauet angivet nedenfor.
Trace < Debug < Info < Warn < Error < Fatal
Hvor org.apache.logging.log4j.Level.FATAL
har den højeste prioritet og org.apache.logging.log4j.Level.Trace
den laveste .
1.1.2 Log4j2 Appender Interface
Appender
er en grænseflade, som primært er ansvarlig for at udskrive logningsmeddelelserne til de forskellige destinationer såsom konsol, filer, sockets, database osv. I Log4j2
vi har forskellige typer Appender
implementeringsklasser:
Fig. 1:Log4j2 Appenders
1.1.3 Log4j Layout Class
Layout
komponent angiver det format, som log-sætningerne skrives ind i destinationslageret af Appender
. I Log4j2
vi har forskellige typer Layout
implementeringsklasser:
Fig. 2:Log4j2 Layout
1.2 Hvorfor foretrækker Log4j2 frem for System.out.println?
Nedenfor er nogle af grundene, som er nok til at forstå begrænsningen ved at bruge System.out.println()
:
- Enhver logningsramme giver udviklere mulighed for at logge fejlfindingsoplysninger til et logniveau, der kan bruges som filtreringskriterier, dvs. man kan deaktivere meddelelsen, der tilhører et bestemt logniveau. For eksempel ville udviklere være mere bekymrede for at se
WARN
beskeder endDEBUG
beskeder i produktionsmiljøet - Loggeramme kan producere bedre output og metadata, som hjælper med at fejlfinde og fejlfinde. For f.eks.
Log4j2
gør det muligt at udskrive formateret output ved at angive et formateringsmønster, dvs. ved at brugePatternLayout
man kan inkludere et tidsstempel, klassenavn osv.
2. Log4j2 bedste praksis
- Brug af statisk modifikator til
LogManager
Objekt:Når udviklere erklærer en variabel i koden, kommer den med en overhead. Udviklere kan overvinde denne overhead ved at erklære den statiskeLogger
reference som vist nedenfor.private static final Logger log = Logger.getLogger(YourClassName.class);
- Brug af
isDebugEnabled()
for at sætte DEBUG log på Java, da det vil spare en masse String-sammenkædningsaktivitet. Nedenfor er et eksempel på fejlretningstilstand i Java.if(logger.isDebugEnabled()) { logger.debug("java logging level is DEBUG Enabled"); }
- Vælg omhyggeligt, hvilken slags besked der skal gå til hvert niveau af logning i Java. Det bliver ekstremt vigtigt, hvis udviklere skriver serverapplikationer i Java, og den eneste måde at se, hvad der sker, er Log4j2 logs. Hvis udviklere logger for mange oplysninger, vil applikationens ydeevne blive påvirket. På samme tid, hvis udviklere ikke logger vigtig information som de indgående meddelelser eller de udgående meddelelser i Java-logfiler, så ville det blive ekstremt svært at identificere årsagen til problemet
- Ved brug af enten Log4j2 eller
java.util.logging
til opsætning af logningsrammerne i Java. Som udvikler vil jeg anbefale at bruge Log4j2 fordi det er meget fleksibelt. Det giver mulighed for at ændre logningsniveauet i Java uden at genstarte applikationen. For at gøre dette kan udviklere have Log4j2 Watchdog som løbende leder efterlog4j2.xml
i en bestemt mappe. Hvis den findes, indlæser den den og nulstiller logningsrammerne i Java - Ved at bruge
log4j2.xml
, kan udviklere have forskellig Logger-konfiguration for de forskellige Java-klasser. Udviklere kan have nogle klasser i INFO tilstand, nogle i WARN tilstand eller FEJL tilstand - Et andet vigtigt punkt at huske er formatet af Java-logning. Log4j2 logger giver udvikleren mulighed for at inkludere trådnavnet og det fuldt kvalificerede Java-klassenavn, mens der udskrives logfiler. Det ville være umuligt for at finde sekvens af hændelser, hvis applikationskoden udføres af flere tråde uden at have et trådnavn på sig
- Udviklere kan ændre konfigurationsfilen for at ændre mønsterlayouts format for de felter, som udviklere kaster som output. Nedenfor er et eksempel på et eksempel på en konfigurationsfil:
# Define the root logger with Appender APP log4j.rootLogger=DEBUG, stdout, APP # add a ConsoleAppender to the logger stdout to write to the console log4j.appender.stdout=org.apache.logging.log4j.core.appender.ConsoleAppender log4j.appender.stdout.layout=org.apache.logging.log4j.core.layout.PatternLayout # Pattern to output the caller's file name and line number. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %d{yyyy-MM-dd HH:mm:ss.SSS}; - (%F:%L) - %m%n # Define the file for APP Appender log4j.appender.APP=org.apache.logging.log4j.core.appender.RollingFileAppender log4j.appender.APP.File=example.log #Define Max File Size for APP Appender log4j.appender.APP.MaxFileSize=100KB # Keep one backup file for APP Appender log4j.appender.APP.MaxBackupIndex=1 # Define the layout for APP Appender log4j.appender.APP.layout=org.apache.logging.log4j.core.layout.PatternLayout log4j.appender.APP.layout.ConversionPattern=%5p %t - %d{yyyy-MM-dd HH:mm:ss.SSS}; - %c [%thread] - %m%n
Følgende er beskrivelsen af de mønstre, der vises i
log4j2.properties
fil:%5p
:Den skriver niveauet i loggen.5
i%5p
er at indstille feltets bredde til5
tegn%d{yyyy-MM-dd HH:mm:ss.SSS}
:Den skriver datoen i det givne dato-tidsformat%t
:Den skriver metodenavnet i loggen%c
:Den skriver det absolutte klassenavn (for f.eks.com.jcg.log4j2.demo
) i loggen%m%n
:Den skriver beskeden til loggen%L
:Den skriver linjenummeret i loggen%F
:Den skriver klassenavnet i loggen
- Lav tilpassede Log4j2-tillæg:Hvis udviklere ønsker at gøre noget, som standardtillæggene ikke understøtter, kan de enten søge online eller skrive deres egne tilpassede bilag. For f.eks. Udviklere kan lave deres egen tilpassede Log4j2 Appender ved at udvide
AppenderSkeleton
klasse. Det giver koden til en fælles funktionalitet, såsom understøttelse af tærskelfiltrering og understøttelse af generelle filtre. Udviklere kan endda tilføje deres funktionalitet oven i det som vist nedenfor:import java.util.ArrayList; import java.util.List; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.spi.LoggingEvent; public class CustomAppender extends AppenderSkeleton { List eventsList = new ArrayList(); @Override protected void append(LoggingEvent event) { eventsList.add(event); } public void close() { } public boolean requiresLayout() { return false; } }
- Mens du skriver beskeden til logning i Java, prøv at bruge en form for præfiks til at angive, hvilken del af applikationskoden der udskriver loggen. For f.eks. Klientsiden, Databasesiden eller Sessionssiden. Tro mig, jeg har brugt denne teknik, og det hjalp meget, mens jeg fejlede problemerne. For f.eks. Udviklere kan sætte hele databaseniveauloggen med præfikset "DB_LOG ” og indsæt log på hele sessionsniveau med præfikset “SESSION_LOG "
- Hvis en given logger ikke er tildelt et niveau, så arver den et fra sin nærmeste forfader. Det er derfor, udviklere altid tildeler logniveauet til en rodlogger i konfigurationsfilen, dvs.
log4j2.rootLogger=DEBUG
- Log altid beslutningserklæringerne. For f.eks. Udviklere har en Java-applikation, som indlæser nogle indstillinger fra præferencefilen eller miljøet. Hvis den ikke findes, indlæser den standardindstillingerne og logger disse oplysninger som nedenfor:
logger.info("Not able to load personal settings, Default Setting selected for user : {user});
- Sørg for at bruge de korrekte logningsniveauer i applikationskoden. En af de store fordele ved at bruge en logningsramme er at kunne skrue op eller ned for omfanget af logningen til enhver tid. Log ikke alt som DEBUG. Sørg for at tænke over, hvilke oplysninger der vil være nyttige senere, når du fejlfinder applikationsproblemerne
- Udviklere kan bruge filtre, som kan konfigureres til at undertrykke de specifikke logmeddelelser. Følgende er konfigurationsdetaljerne for
log4j2.properties
for at opsætte filtrene for at undertrykke visse logningsudsagn:# Only INFO log4j.appender.R=org.apache.logging.log4j.core.appender.RollingFileAppender log4j.appender.R.File=SampleLog.log log4j.appender.R.MaxFileSize=500KB log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.logging.log4j.core.layout.PatternLayout log4j.appender.R.layout.ConversionPattern=%d [%t] %-5p %c - %m%n log4j.appender.R.filter.a=org.apache.log4j.varia.LevelRangeFilter log4j.appender.R.filter.a.LevelMin=INFO log4j.appender.R.filter.a.LevelMax=INFO # only ERROR log4j.appender.ERROR=org.apache.logging.log4j.core.appender.RollingFileAppender log4j.appender.ERROR.File=SampleLog.txt log4j.appender.ERROR.MaxFileSize=500KB log4j.appender.ERROR.MaxBackupIndex=1 log4j.appender.ERROR.layout=org.apache.logging.log4j.core.layout.PatternLayout log4j.appender.ERROR.layout.ConversionPattern=%d [%t] %-5p %c - %m%n log4j.appender.ERROR.filter.b=org.apache.log4j.varia.LevelMatchFilter log4j.appender.ERROR.filter.b.LevelToMatch=ERROR log4j.appender.ERROR.filter.b.AcceptOnMatch=true log4j.appender.ERROR.Threshold=ERROR
Det var alt for dette indlæg. God læring og glem ikke at dele!!
3. Konklusion
Disse tips og eksempler på logning i Java er baseret på min erfaring og hvordan jeg bruger logningsrammerne i Java. På ingen måde, er ikke komplet. Jeg ville elske at høre nogle flere tips fra jer, og hvordan I bruger og tilpasser Java logging.core java Java Java 8 log4j