我想創建一個自定義 log4j2 滾動檔案附加程式。我需要創建這個自定義附加程式,因為我想用當前執行緒名稱包裝檔案名。我們正在嘗試將 log4j 1.x 遷移到最新的 log4j2 版本,之前我們使用 DailyRollingFileAppender 來記錄我們應用程式的所有活動。
請找到以下代碼。
在這里,我們嘗試在基于 threadName 的 DailyRollingFileAppender 的幫助下每天將日志附加到檔案中。
由于 DailyRollingFileAppender 在最近的版本中已被棄用 - 所以,如何創建自定義滾動檔案附加程式并結合我們基于執行緒的邏輯。?
找到下面的 log4j.properties 檔案
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
謝謝!
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;
}
}
uj5u.com熱心網友回復:
RollingFileAppenderLog4j 2.x 中的 是,final所以你不能擴展它。但是,您可以使用以下方法獲取自定義 Log4j 1.x 附加程式的功能:
- A
RoutingAppender,它可以按需創建附加程式, - 多個
RollingFileAppender將寫入和旋轉您的檔案, EventLookup檢索當前執行緒名稱。
對于一個簡單的logfile-per-thread appender,您可以使用:
<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>
對于更復雜的配置,<Routing>appender 和<Routes>can 都包含<Script>(參見檔案):
- appender 中的腳本
<Routing>可以初始化staticVariables地圖并回傳默認路由, - 組件中的腳本根據記錄事件
<Routes>選擇適當的路由。staticVariables
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/444727.html
