Java >> Java tutorial >  >> Tag >> Log4j

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 end DEBUG 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 bruge PatternLayout 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 statiske Logger 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 efter log4j2.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 til 5 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

Java tag