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 initialiserestaticVariables
kort og returner en standardrute, - scriptet i
<Routes>
komponent vælger den passende rute baseret påstaticVariables
og logningshændelsen.