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

opret en tilpasset log4j2 rullende filtilføjelse

Jeg vil oprette en tilpasset log4j2 rullende filtilføjelse. Jeg er nødt til at oprette denne brugerdefinerede appender, fordi jeg vil ombryde filnavnet med det aktuelle trådnavn. Vi forsøger at migrere log4j 1.x til den seneste log4j2-version, og tidligere havde vi brugt DailyRollingFileAppender til at logge alle aktiviteter i vores applikation.

find venligst nedenstående kode.

Her forsøger vi at tilføje loggen til en fil på daglig basis ved hjælp af DailyRollingFileAppender baseret på trådnavn.

Da DailyRollingFileAppender er forældet i den seneste version - så hvordan opretter man tilpasset rullende filtilføjelse med inkorporering af vores trådbaserede logik.?

Find nedenstående log4j.properties-fil

log4j.logger.***=INFO, FileLogger
# log4j.appender.FileLogger=org.apache.log4j.DailyRollingFileAppender
# Custom Appendar which will redirect the logs based on thread names configured using 
# log4j.appender.FileLogger.threadNameMapping property below
log4j.appender.FileLogger=********.framework.log4j.appender.ThreadNamePatternAppender 
log4j.appender.FileLogger.DatePattern='.'yyyy-MM-dd
log4j.appender.FileLogger.file=/logs/fileName.log
log4j.appender.FileLogger.layout=org.apache.log4j.PatternLayout
log4j.appender.FileLogger.layout.ConversionPattern=%d [%-5p] [%t] [%c{1}] [%M] - %m%n
# Custom property to hold mapping between thread names and log file for plug-in
# Beware - ThreadNamePatternAppender class inherits DailyRollingFileAppender hence it will not work for any other type of appender
# This can be distuingished using - ThreadName1>ThreadName1.log|ThreadName2>ThreadName2.log|.....|ThreadNameN>ThreadNameN.log
# Note - If there is no mapping for a particular thread then logs will be written to default log file
log4j.appender.FileLogger.threadNameMapping=********/logs/fileName-fileName.log

Tak!

import java.util.HashMap;
import java.util.Map;

import org.apache.logging.log4j.core.appender.RollingFileAppender;

import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;


public class ThreadNamePatternAppender extends DailyRollingFileAppender {
    private Map<String, DailyRollingFileAppender> threadBasedSubAppenders = new HashMap<String, DailyRollingFileAppender>();
    private String threadNameMapping;

    public String getThreadNameMapping() {
        return threadNameMapping;
    }

    public void setThreadNameMapping(String threadNameMapping) {
        this.threadNameMapping = threadNameMapping;
    }

    @Override
    public void activateOptions() {
        super.activateOptions();
        if (threadNameMapping != null && threadNameMapping.trim().length() > 0) {
            DailyRollingFileAppender tempAppender;
            String[] threadNames = threadNameMapping.split("\|");
            for (String threadName : threadNames) {
                if (threadName != null && threadName.length() > 0) {
                    try {
                        LogLog.debug(String.format("Creating new appender for thread %s", threadName));
                        tempAppender = new DailyRollingFileAppender(getLayout(), threadName.split(">")[1],
                                getDatePattern());
                        threadBasedSubAppenders.put(threadName.split(">")[0], tempAppender);
                    } catch (Exception ex) {
                        LogLog.error("Failed to create appender", ex);
                    }
                }
            }
        }
    }

    @Override
    public void append(LoggingEvent event) {
        String threadName = event.getThreadName().split(" ")[0];
        if (threadBasedSubAppenders.containsKey(threadName)) {
            threadBasedSubAppenders.get(threadName).append(event);
        } else {
            super.append(event);
        }
    }

    @Override
    public synchronized void close() {
        LogLog.debug("Calling Close on ThreadNamePatternAppender" + getName());
        for (DailyRollingFileAppender appender : threadBasedSubAppenders.values()) {
            appender.close();
        }
        this.closed = true;
    }
}



  

Svar

RollingFileAppender i Log4j 2.x er final , så du kan ikke forlænge den. Du kan dog få funktionaliteten af ​​din brugerdefinerede Log4j 1.x-tilføjelse ved at bruge:

  • A RoutingAppender , som kan oprette bilag efter behov,
  • Flere RollingFileAppender der vil skrive og rotere dine filer,
  • EventLookup for at hente det aktuelle trådnavn.

For en simpel logfil-per-tråd appender du kan bruge:

<Routing name="Routing">
  <Routes pattern="$${event:ThreadName}">
    <Route>
      <RollingFile name="Rolling-${event:ThreadName}"
                   fileName="logs/thread-${event:ThreadName}.log"
                   filePattern="logs/thread-${event:ThreadName}.log.%d{yyyy-MM-dd}">
        <PatternLayout pattern="%d [%-5p] [%t] [%c{1}] [%M] - %m%n" />
        <TimeBasedTriggeringPolicy />
      </RollingFile>
    </Route>
  </Routes>
</Routing>

For en mere kompleks konfiguration både <Routing> appender og <Routes> kan indeholde en <Script> (jf. dokumentation):

  • scriptet i <Routing> appender kan initialisere staticVariables kort og returner en standardrute,
  • scriptet i <Routes> komponent vælger den passende rute baseret på staticVariables og logningshændelsen.

Java tag