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

Hvordan implementerer Log4j 2.x doven argumentevaluering?

Jeg gætter på, hvad Log4j betyder, er, at med de krøllede parenteser undgår de at konstruere en streng, når det ikke er nødvendigt (f.eks. er niveauet ikke Debug):

Med

logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));

hele meddelelsen beregnes altid, selv når den ikke bliver logget.

Med

logger.debug("Entry number: {} is {}", i, entry[i]);

Log4j kan tjekke log-niveauet først og derefter beslutte, om det er værd at konstruere meddelelsesstrengen. Dette sparer de nødvendige ressourcer til strengsammenkædning. Den kalder kun toString() på de leverede objekter, hvis meddelelsen faktisk oprettes, hvilket sparer yderligere beregningsomkostninger.

Log4j bruger en intern klasse (org.apache.logging.log4j.message.ParameterFormatter ), der erstatter hver {} med de fremlagte argumenter. Det vil også fange undtagelser fra toString() og rapporter disse fejl.


For at undgå argumentevaluering skal du bare pakke det ind i lambda:

logger.debug(() -> { 
   "Entry number: " + i + " is " + String.valueOf(entry[i])
});

I denne form vil leverandøren først blive indkaldt til byggeri før egentlig logning. Tænk på det som en funktionserklæring.


Java tag