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

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 kalder DailyRollingFileAppender '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

  1. Opret et simpelt Java-projekt i eclipse
  2. Download log4j jar og inkluder i dit projekt ved at klikke på Project Properties -> Java Build Path -> Libraries -> Add Jars
  3. Kopiér nedenstående java-kode i projektet
  4. Inkluder en enkelt bilag i dit projekt ad gangen
  5. 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.

7. Download kildekoden


Java tag