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

Log4j ImmediateFlush Property Eksempel

Denne artikel er et selvstudie om logprioritetsniveauer i Log4j. I denne vejledning skal vi konfigurere log4j via egenskabsfiler.

1. Introduktion

Log4J (Java ) er en meget brugt logningsramme til Java. Det fortsætter med at vokse kontinuerligt med den nylige opgradering til Log4j2. Log4j understøtter logning via Logger, Appender og Layouts.

Logger er interaktionspunktet for applikationen og udfører logningsaktiviteten. Det bruges til at angive logningstilstanden og navnet på loggeren. Den leverer også logfiler til den angivne destination ved hjælp af appenderen. Tillægget leverer loggen til logningsdestinationen dvs. konsol, fil eller database sammen med muligheder for at finjustere logningsmekanismen. Appendere har generelt livscykluskonfiguration og filtreringsunderstøttelse. Filtrering gør det muligt at filtrere de meddelelser, hvis logningstilstand ikke matcher det konfigurerede niveau. Log4j understøtter flere foruddefinerede appenders og hjælper også med at skabe brugerdefinerede appenders.

Layout angiver visningsformatet for logfilerne. Det mest brugte layout til Log4j er PatternLayout . Et prøvemønster er %d [%t] %-5p (%F:%L) – %m%n. Formatstrengene for mønsteret er som følger:

  • Dato – Fuld dato indtil mikrosekunder.
  • Tråd – JVM-tråd, der logger output.
  • Logningstilstand – INFO/FEJL/DEBUG/ADVARSEL.
  • Klasse – Java-klasse, der logger output.
  • Linjenummer – Linjenummer i java-klassen.
  • Besked – Beskeden logget.
  • Standard linjeseparator -/n, medmindre andet er angivet.

2. Øjeblikkelig skylning

Ovenstående egenskab styrer leveringstidspunktet for logfiler til destinationen. Hvis den er sat til sand, leveres den efter hvert metodekald. Som standard er den sat til sand. Nedenfor vil vi dække et klassisk eksempel.

Eksempelklasse

package com.jcg.examples;
import org.apache.log4j.Logger;
public class LoggerMain {
	public static final Logger logger = Logger.getLogger(LoggerMain.class);
	public static void main(String[] args) {
		int loop = 0;
		while (loop < 1000) {
			logger.warn("This is a warn log");
			loop++;
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				logger.error("Error occurred in sleep", e);
				Thread.currentThread().interrupt();
			}
		}
	}
}
  • Linje 4 konfigurerer en logger med navnet som com.jcg.examples.LoggerMain .
  • Linje 8 angiver den anvendte metode, dvs. logningsniveau for denne meddelelse.

Her har vi brugt en tråd til at vente i 20 millisekunder, før vi logger hvert output. Dette er for at observere virkningerne af øjeblikkelig skylning. Den næste del er konfiguration af loggeren via XML-fil eller egenskaber. Nedenfor har vi brugt egenskaber til at give en passende konfiguration for appenderen og destinationen.

Konfiguration

log4j.rootLogger=DEBUG, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p - %m%n

Her er ejendommen slet ikke angivet og er misligholdt. Ovenstående konfiguration resulterer i, at logs udskrives kontinuerligt. Nedenfor er et eksempel på et skærmbillede af det samme.

log4j_immediate_flush

3. Forsinket skylning

Nedenfor vil vi dække et eksempel på forsinket skylning. Dette gøres ved at ændre konfigurationen som nedenfor.

log4j.rootLogger=DEBUG, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.immediateFlush=false
log4j.appender.console.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p - %m%n

Appender batcherer nu logningen og logger med specificerede intervaller. Forskellen er ikke synlig i et skærmbillede af outputtet, men den er synlig under en løbetur. Logs udskrives ikke umiddelbart på konsollen, men de udskrives i batches. Logtidsstemplet er nøjagtigt magen til den forrige kørsel, men logfilerne bliver udskrevet til konsollen på en batch-måde.

Fordelen ved en sådan tilgang er ydeevne. Logs kan skrives til eksterne grænseflader såsom en fil, database og ikke kun konsol. Hvert opkald til den eksterne grænseflade er dyrt, og batching af logfiler giver nogle seriøse ydeevneforbedringer. Logning er en tværgående bekymring, og det er udviklerens ansvar at sikre, at ydeevnen ikke forringes af omfattende/overdreven logning.

3.1. Bekymringer om forsinket skylning

Forsinket skylning har en alvorlig indvirkning i tilfælde af fejl. Da logning udføres i batches, er det sandsynligt, at de sidste par loghændelser ikke vil blive registreret i logningsdestinationen, når applikationen afsluttes. På det tidspunkt, i tilfælde af en fejlagtig exit, kan vi ikke inspicere de seneste logfiler, som faktisk forårsagede problemet. Lad os observere ulemperne ved forsinket skylning med et eksempel.

Eksempelklasse (ændret)

package com.jcg.examples;
import org.apache.log4j.Logger;
public class LoggerMain {
	public static final Logger logger = Logger.getLogger(LoggerMain.class);
	public static void main(String[] args) {
		int loop = 0;
		while (loop < 100) {
			logger.warn("This is a warn log");
			loop++;
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				logger.error("Error occurred in sleep", e);
				Thread.currentThread().interrupt();
			}
		}
	}
}

I dette tilfælde introducerer vi ikke fejl. Vi opretter en kortere loop, som afsluttes inden for 100 iterationer. Overraskende nok, i dette tilfælde vil programmet køre, og ingen logfiler bliver udskrevet på konsollen. Vores program er afsluttet, allerede før den første batch af logfiler er udskrevet. Det samme vil ske i tilfælde af fejl, der resulterer i ansøgningsafbrydelse.

Med forsinket skylning kan vi opnå ydeevne i området fra 10 til 20 %. Men der er en klar mulighed for at miste logfiler under ansøgningsafslutning. Denne afvejning skal tages i betragtning under applikationsdesign.

4. Udførelsestrin

  1. Importer eksemplet som et Maven-projekt.
  2. Maven importerer afhængighederne automatisk.
  3. Kør projektet ved at ændre konfigurationen som nævnt ovenfor.
  4. Stop det kørende projekt i formørkelse efter 5 minutter.

5. Download kildekoden

Øjeblikkelig Skylning
Java tag