![](/img/trans.png)
[英]Log4j2: Programmatically create file appender with timestamp in the filename
[英]LOG4J2 - How to create a File appender programmatically?
我需要以編程方式設置文件追加器。
我想在log4j2.xml上設置我的追加程序,但我想在運行時僅(編程)寫入這些追加程序之一。
<Configuration status="WARN">
<Appenders>
<File name="File_1" fileName="c:/FILE_1.log" >
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
<File name="File_2" fileName="c:/FILE_2.log" >
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
<File name="File_3" fileName="c:/FILE_3.log" >
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="File_1"/>
<AppenderRef ref="File_2"/>
<AppenderRef ref="File_3"/>
</Root>
</Loggers>
例:
if(condition.equals("A")){
//write log on File_1
}else if(condition.equals("B")){
//write log on File_2
}else {
//write log on File_3
}
通過瀏覽Internet上的各種教程,他們解釋了如何在運行時以編程方式添加附加程序。 有沒有一種方法可以在運行時僅選擇xml配置文件中定義的附加程序之一?
第一個解決方案:
我已嘗試通過以下方式解決問題,但是我對解決方案不滿意,因為未通過編程方式刪除log4j2.xml中定義的文件,而且永遠不會刪除第一個Appender! 我認為log4j2中存在一個錯誤: https ://issues.apache.org/jira/browse/LOG4J2-135(狀態已解決,但我認為不是...我正在使用log4j-2.0-beta9)
static org.apache.logging.log4j.core.Logger coreLogger =
(org.apache.logging.log4j.core.Logger)LogManager.getLogger(MyClass.class.getName());
static LoggerContext context = (LoggerContext)coreLogger.getContext();
static BaseConfiguration configuration = (BaseConfiguration)context.getConfiguration();
static String FILE_1 = "File_1";
static String FILE_2 = "File_2";
static String FILE_3 = "File_3";
private static Map<String, Boolean> appendersMap;
static
{
appendersMap = new HashMap<String, Boolean>();
appendersMap.put(FILE_1, true);
appendersMap.put(FILE_2, true);
appendersMap.put(FILE_3, true);
}
/**
* Configure appenders.
*
* @param appender the appender
*/
public static void configureAppenders(String appender){
if(appender.equals(FILE_1)){
addAppenders(FILE_1);
removeAppenders(FILE_2,FILE_3);
}
else if(appender.equals(FILE_3)){
addAppenders(FILE_3);
removeAppenders(FILE_1,FILE_2);
}
else if(appender.equals(FILE_2)){
addAppenders(FILE_2);
removeAppenders(FILE_1,FILE_3);
}
}
private static void addAppenders(String appender){
if (!appendersMap.get(appender)){
appendersMap.put(appender, true);
coreLogger.addAppender(configuration.getAppender(appender));
}
}
private static void removeAppenders(String... appenders){
for(String appender : appenders){
appendersMap.put(appender, false);
coreLogger.removeAppender(configuration.getAppender(appender));
}
}
我已將問題報告給log4j2團隊,他們告訴我他們會盡快解決。
自問這個問題以來已經有一段時間了,並且已經有許多請求支持更好的Log4j 2編程配置。從Log4j 2.4開始,已將API添加到log4j-core以便於編程配置 。
新的ConfigurationBuilder
API允許用戶構造組件定義 。 使用此API,無需直接使用實際的配置對象(例如LoggerConfig和FileAppender),而這些對象需要大量有關Log4j如何在后台工作的知識。 組件定義已添加到ConfigurationBuilder,一旦收集了所有定義,便會構造所有實際的配置對象(如Loggers和Appenders)。 感覺有點像XML配置語法,只是要編寫Java代碼。
請注意,新的ConfigurationBuilder
API允許用戶代碼創建新配置或完全替換現有配置。 如果您的用例不同,並且希望在Log4j啟動后以編程方式修改 (而不是替換)現有配置,則需要使用實際的配置對象。 在這種情況下,請參閱手冊的“ 初始化后以編程方式修改當前配置”部分。
如果確實需要直接使用內部配置對象,請注意,您需要在最后調用LoggerContext.updateLoggers()
或Configurator.initialize(Configuration)
才能使更改生效。 例如:
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
... // make changes
ctx.updateLoggers(); // NECESSARY!
這對我有用。 不確定如何。 我沒有更新記錄器,也沒有重新配置上下文。
Logger coreLogger = (Logger)LogManager.getLogger(LoggingStuff.class.getName());
Layout layout = ((LoggerContext)LogManager.getContext()).getConfiguration().getAppender("Console").getLayout();
Appender appender = FileAppender.newBuilder().withName("File").withFileName("target/bash.log").withLayout(layout).build();
appender.start();
coreLogger.addAppender(appender);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.