Log4j Rotationseksempel
Denne artikel er et selvstudie om logrotation i Log4j. I denne vejledning skal vi konfigurere log4j via egenskabsfiler.
1. Introduktion
Log4J(Java ) er meget udbredt logningsramme for Java. Det fortsætter med at vokse kontinuerligt med den seneste opgradering af Log4j2. Vi ønsker at rotere logfiler for at undgå logfilakkumulering og nemt adskille logfiler under logmappen.
Log4j understøtter logning ved hjælp af Appender og Layouts. Layout angiver visningsformatet for logfilerne. Almindelig brugt 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 outputtet
- Logningstilstand – INFO/FEJL/DEBUG/ADVARSEL
- Klasse – Java-klasse, der logger outputtet
- Linjenummer – Linjenummer i java-klassen
- Besked – Beskeden logget
- Standard linjeseparator -/n, medmindre andet er angivet
Eksempel på logs
Tillæg leverer loggen til logningsdestinationen sammen med muligheder for at finjustere logningsmekanismen. Appendere har generelt livscykluskonfiguration og filtreringsunderstøttelse. Filtrering gør det muligt at filtrere meddelelser, hvis logningstilstand ikke matcher det konfigurerede niveau. To af de meget brugte appenders er DailyRollingFileAppender
og RollingFileAppender
som vi vil se nedenfor.
2. RollingFileAppender
RollingfileAppender
roterer logfiler baseret på filstørrelse. MaxFileSize angiver den maksimale filstørrelse, mens MaxBackupIndex angiver mængden af filer, der skal opbevares i logmappen. Et eksempel på egenskabsfil er givet nedenfor:
log4j.properties
log4j.rootLogger=INFO, fileLogger log4j.appender.fileLogger=org.apache.log4j.RollingFileAppender log4j.appender.fileLogger.layout=org.apache.log4j.PatternLayout log4j.appender.fileLogger.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n log4j.appender.fileLogger.File=example.log log4j.appender.fileLogger.MaxFileSize=1KB log4j.appender.fileLogger.MaxBackupIndex=5
RollingFileAppender Eksempel Log
Efter 5 logfiler er genereret, begynder den automatisk at slette logfilerne. Så på ethvert tidspunkt kan du maksimalt se 5 logfiler og ikke mere end det. Størrelsen er begrænset i eksemplet til 1 KB. Ideelt set ville størrelsen være omkring MB og er baseret på applikationsbehov.
3. DailyRollingFileAppender
DailyRollingFileAppender
roterer logfiler baseret på tidsfrekvens, hvilket tillader tilpasning op til minut. Datomønstre tilladt som en del af tillægget er som følger:
- åååå-MM Rul over til ny logfil, der begynder den første dag i hver måned
- åååå-ww Rul over til ny logfil, der begynder den første dag i hver uge
- åååå-MM-dd Overfør dagligt
- åååå-MM-dd-a Vend over middag og midnat
- åååå-MM-dd-HH Rul om hver time
- åååå-MM-dd-HH-mm Rul over hvert minut
log4j.properties
log4j.rootLogger=INFO, fileLogger log4j.appender.fileLogger.layout=org.apache.log4j.PatternLayout log4j.appender.fileLogger.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n log4j.appender.fileLogger.File=example.log log4j.appender.fileLogger=org.apache.log4j.DailyRollingFileAppender log4j.appender.fileLogger.datePattern='.'yyyy-MM-dd-HH-mm
DailyRollingFileAppender Log eksempler
Standard datomønster er åååå-MM-dd dvs. ruller hver dag. En ulempe ved denne appender er, at sletning af gammel logfil ikke sker automatisk. Alternativet er at implementere din egen tilpassede appender.
4. Brugerdefineret tillæg
Custom Appender kan oprettes ved at udvide AppenderSkeleton
klasse eller AbstractAppender
. Typisk kan vi skrive vores egen version af doAppend
. Vores mål er at knytte maxbackupindex-kapacitet til DailyRollingFileAppender
. Så det er bedre at udvide DailyRollingFileAppender
Klasse og sørge for vores implementering.
Tilpasset bilag
package org.apache.log4j; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.log4j.helpers.LogLog; public class CustomAppender extends DailyRollingFileAppender { private int maxBackupIndex; public void setMaxBackupIndex(int maxBackupIndex) { this.maxBackupIndex = maxBackupIndex; } @Override public void rollOver() throws IOException { super.rollOver(); File file = new File(fileName); List<String> files = new ArrayList<>(); File[] dirFiles = new File(file.getAbsolutePath()).getParentFile().listFiles(); if (dirFiles != null && dirFiles.length > 0) { Arrays.sort(dirFiles, (a, b) -> Long.compare(a.lastModified(), b.lastModified())); for (File allFile : dirFiles) { if (allFile.getName().contains(fileName)) { files.add(allFile.getAbsolutePath()); } } } if (files.size() > maxBackupIndex+1) { File deleteFile = new File(files.get(0)); LogLog.debug("delete result for"+deleteFile.getAbsolutePath()+" is "+deleteFile.delete()); files.remove(0); } } }
- Linje 1- Pakkeerklæring er log4j. Vi har brug for den til at tilsidesætte
rollover
metode, da synlighed ikke kan udvides i en anden pakke - Linje 13- tager en mulighed for at kontrollere det maksimale antal filer, der skal sikkerhedskopieres, bortset fra den nuværende fil
- Linje 20,21- Tilsidesæt
rollover
metode. Rollover bliver kaldt, når en fil skal rulles over. Vi kalderDailyRollingFileAppender
's metode til at afslutte sin rollover-proces, dvs. den omdøber den gamle fil baseret på tid og opretter en ny fil med det angivne filnavn - Linje 26 – Sorter filnavnene efter stigende rækkefølge efter oprettet tid.
- Linje 28,29 – Filtrer filnavne, der indeholder vores logfilnavn. I en dedikeret log-mappe ville kun vores logfiler være der, og dette trin kan være unødvendigt. Den tilføjes som en advarsel, hvis den angivne mappe indeholder andre filer.
- Linje 33,37 – slet den ældste logfil og fjern den fra listen
Dette forbedrer Dailyrollingfileappender
. Typisk brug ville være at opbevare 20 dages log og slette resten af dem.
log4j.properties
log4j.rootLogger=INFO, fileLogger log4j.appender.fileLogger.layout=org.apache.log4j.PatternLayout log4j.appender.fileLogger.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n log4j.appender.fileLogger.File=example.log log4j.appender.fileLogger=org.apache.log4j.CustomAppender log4j.appender.fileLogger.datePattern='.'yyyy-MM-dd-HH-mm
Eneste ændring er at inkludere vores brugerdefinerede bilag. Datomønsterbrug svarer til DailyRollingFileAppender
og den adfærd er udvidet i vores tilpassede klasse.
5. Udførelsestrin
- Opret et simpelt Java-projekt i eclipse
- Download log4j jar og inkluder i dit projekt ved at klikke på Project Properties -> Java Build Path -> Libraries -> Add Jars
- Kopiér nedenstående java-kode i projektet
- Inkluder en enkelt bilag i dit projekt ad gangen
- Stop det kørende projekt i formørkelse efter 5 minutter for at se forskellige logfiler
Java Logger-klasse
package com.jcg.examples; 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) { while (true) { logger.info("This is a test log"); } } }
- Linje 1- Opret en simpel klasse til logningsformål
- Linje 5- Oprettelse af logger for den nyoprettede klasse ved at bruge fabriksmetoden
- Linje 8 - brug
info
metode til at logge en besked
Hele koden kører i en uendelig løkke, og det er derfor nødvendigt at afslutte manuelt.
6. Resumé
I denne tutorial så vi, hvordan man opnår log4j-rotation via egenskabsfiler. Vi så to typer eksisterende log4j rotationsvedhæng og en brugerdefineret bilag med eksempler.