Log4j Datoformat Eksempel
Denne artikel er et selvstudie om datoformatmønstre 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. Appenderen leverer loggen til logningsdestinationen dvs. konsollen, filen eller databasen 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 eksempelmø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 logning af output.
• Logging Mode – INFO/FEJL/DEBUG/WARN.
• Klasse – Java-klasse logger output.
• Linjenummer – Linjenummer i en java-klasse.
• Besked – Beskeden logget.
• Standard linjeseparator -/n medmindre andet er angivet.
I denne tutorial skal vi dykke dybere ned i %d
dato mønster.
2. SimpleDateFormat-mønster
Vi vil designe en simpel logningsklasse for at illustrere vores scenarie med eksempler.
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.
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 tillægget 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
- Linje 5 indeholder datomønsteret. Her svarer mønsterstrengen til klassen
java.text.SimpleDateFormat
i java.
Mønsterstrengen kan opdeles i
- åååå- år med 4 cifre
- MM – Måned med 2 cifre
- dd – dato med 2 cifre
- HH – Time
- mm -minutter
- ss – sekunder
- SSS – millisekunder
Dette mønster bruges af SimpleDateFormat
klasse for at gengive datoen i logfilen. Nedenfor er et skærmbillede af en sådan logningsoutput.
log4j_default_format
Log4j understøtter tre andre tilpassede hjælpeklasser til datoformat, som vi vil dække i nedenstående afsnit.
3. ISO8601-formatering
Ovenstående output kan opnås ved at bruge org.apache.log4j.helpers.ISO8601DateFormat
klasse. Nedenfor er konfigurationen til at aktivere ISO8601DateFormat
klasse.
ISO8601-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{ISO8601} %-5p - %m%n
- I linje 5, i stedet for et datomønster,
ISO8601
er angivet til at kaldeISO8601DateFormat
klasse.
Outputtet ligner nøjagtigt det tidligere output, der er konfigureret af mønsterstrengen yyyy-MM-dd HH:mm:ss,SSS
leveret til SimpleDateFormat
klasse.
4. DateTime formatter
En alternativ måde at repræsentere hele tiden på er at bruge org.apache.log4j.helpers.DateTimeDateFormat
klasse. Nedenfor er konfigurationen til at aktivere DateTimeDateFormat
klasse.
DATO-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{DATE} %-5p - %m%n
- På linje 5, i stedet for
ISO8601
mønster,DATE
er angivet til at kaldeDateTimeDateFormat
klasse.
Nedenfor kan vi se outputtet af kørende datoformater. Der er kun en subtil forskel mellem ISO8601
formatter og DATE
formater. Datoen er repræsenteret i den udvidede form for bedre læsbarhed. Det svarer til at angive mønsteret dd MM YYYY HH:mm:ss,SSS
til SimpleDateFormat
klasse.
log4j_DATE_pattern
5. AbsoluteTime-formatering
Absolut formatering viser kun tidsdelen af loggen og ignorerer dagdelen. Dette indebærer brug af org.apache.log4j.helpers.AbsoluteTimeDateFormat
klasse. Nedenfor er konfigurationen til at aktivere AbsoluteTimeDateFormat
klasse.
ABSOLUT 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{ABSOLUTE} %-5p - %m%n
- På linje 5 i stedet for
DATE
mønster,ABSOLUTE
er angivet til at kaldeAbsoluteTimeDateFormat
klasse.
Nedenfor kan vi se outputtet af at køre Absolute formatter. Det svarer til at angive mønsteret HH:mm:ss,SSS
til SimpleDateFormat
klasse.
log4j_ABSOLUTE_pattern
6. Udførelsestrin
- Importer eksemplet som et Maven-projekt.
- Maven importerer afhængighederne automatisk.
- Kør projektet ved at ændre konfigurationen som nævnt ovenfor.
- Stop det kørende projekt i formørkelse efter 5 minutter.
7. Resumé
I dette afsnit har vi dækket SimpleDateFormatter
og log4js brugerdefinerede formatere. Log4j anbefaler sine egne brugerdefinerede formatere i helpers
pakke over SimpleDateFormatter
af præstationsmæssige årsager.