簡體   English   中英

LOG4J2-如何以編程方式創建文件附加器?

[英]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團隊,他們告訴我他們會盡快解決。

https://issues.apache.org/jira/browse/LOG4J2-468

自問這個問題以來已經有一段時間了,並且已經有許多請求支持更好的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM