java - 如何在 java 中重新加载已编程的 log4j2 配置

标签 java log4j2

现在我花了一些时间在 java 记录器上:log4j2 如果您决定在 .xml 文件的基础上工作,则该方法相对容易。 但是如果你想通过代码创建配置,并通过java进行适配,那就有点复杂了。

下面是我现在可以管理的代码。 我重新配置日志级别没有成功

每次深度都在错误级别停止

2017-03-15 23:24:27,248 [main] ERROR: This is Logger for 1 Error 
2017-03-15 23:24:27,256 [main] ERROR: This is Logger 1 Error 

能否请您帮忙指定如何重新加载已编程的 log4j2 配置?

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;

public class Log4j2Init {

    // -------------------------------------------------------
    //                      CONSTRUCTOR
    // -------------------------------------------------------
    public Log4j2Init() {

    }

    // -------------------------------------------------------
    //                          TEST
    // -------------------------------------------------------

    public static void main(String[] args) {

        Logger logger;

        Log4j2Init log4j2Init = new Log4j2Init();
        log4j2Init.addAppenderLogger("./pac-tool.log",Level.ERROR);
        logger = LogManager.getLogger(Log4j2Init.class.getName());

        logger.info("This is Logger for 1 Info");
        logger.error("This is Logger for 1 Error");
        logger.debug("This is Logger for 1 Debug");
        logger.trace("This is Logger for 1 Trace");

        // Reconfiguration of log depth
        log4j2Init.addAppenderLogger("./pac-tool.log",Level.TRACE);
        logger = LogManager.getLogger(Log4j2Init.class.getName());

        logger.info("This is Logger 1 Info");
        logger.error("This is Logger 1 Error");
        logger.debug("This is Logger 1 Debug");
        logger.trace("This is Logger 1 Trace");

    }


    // -------------------------------------------------------
    //                          METHOD
    // -------------------------------------------------------

    public void addAppenderLogger(String filename, Level vlevel )
    {
        ConfigurationBuilder< BuiltConfiguration > builder;
        LayoutComponentBuilder layoutBuilder;
        AppenderComponentBuilder appenderBuilder;

        // Create log4j2  Builder
        builder = ConfigurationBuilderFactory.newConfigurationBuilder();
        builder.setStatusLevel( Level.INFO);
        builder.setConfigurationName("BuilderTest");

        // ------------------------------------------
        // CONSOLE
        // ------------------------------------------
        // PatternLayout
        layoutBuilder = builder.newLayout("PatternLayout")
                .addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable");

        // Create Console Appender : Type = "CONSOLE"
        appenderBuilder = 
                builder.newAppender("Stdout", "CONSOLE")
                .addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT)
                .add(layoutBuilder);

        builder.add( appenderBuilder );

        // ------------------------------------------
        // FILE
        // ------------------------------------------
        // PatternLayout
        layoutBuilder = builder.newLayout("PatternLayout")
                .addAttribute("pattern", "%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n");

        // Create File Appender : Type = "FILE"
        appenderBuilder = builder.newAppender("logfile", "FILE")
                .addAttribute("fileName", filename)
                .addAttribute("append", "false")
                .addAttribute("immediateFlush", "false")
                .add(layoutBuilder);

        builder.add(appenderBuilder);


        // create the new logger
        builder.add( builder.newRootLogger( vlevel )
                .add( builder.newAppenderRef( "Stdout" ) )
                .add( builder.newAppenderRef( "logfile" ) )
                );

        Configurator.initialize(builder.build());


    }

}

谢谢

最佳答案

解决方法:

import java.nio.file.Paths;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;

public class Log4j2Init {

private String logPath;

// -------------------------------------------------------
//                      CONSTRUCTOR
// -------------------------------------------------------
/**
 * Initialize Log4j2
 * Configure log path which will be used in "log4j2.xml"
 *  Common error is caused by the static logger
 *  If you logs before the System.setProperty, this will cause the variable UNDEFINED error.
 *  private static final Logger logger = LogManager.getLogger(test.class.getName());
 *  is forbidden here !!
 */
public Log4j2Init() {
    logPath = Paths.get(getUserAppDirectory()+"/Pac-Tool").toString();
    System.setProperty("logpath.name",logPath);
}

// -------------------------------------------------------
//                          TEST
// -------------------------------------------------------

public static void main(String[] args) {

    Log4j2Init log4j2Init = new Log4j2Init();
    System.out.println("Pat of the Log File : " + log4j2Init.getLogPath());

    // Create the Logger
    Logger logger = LogManager.getLogger(Log4j2Init.class.getName());

    @SuppressWarnings("resource")
    LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    Configuration config = ctx.getConfiguration();
    LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME); 

    // Read the Appenders
    System.out.println("Appenders declared in .xml :" + loggerConfig.getAppenderRefs());
    System.out.println("Appenders used in Logger :" + loggerConfig.getAppenders());

    // Apply the level specified in log4j2.xml
    System.out.println("Log Level (default in .xml)= " + loggerConfig.getLevel());
    logger.error("This is Logger for 1 Error");
    logger.info("This is Logger for 1 Info");
    logger.debug("This is Logger for 1 Debug");
    logger.trace("This is Logger for 1 Trace");

    // Remove Console Logger + Set new log level 
    loggerConfig.removeAppender("Console");
    loggerConfig.setLevel(Level.TRACE);
    ctx.updateLoggers();  

    System.out.println("Log Level = " + loggerConfig.getLevel());
    System.out.println("Appenders used in Logger :" + loggerConfig.getAppenders());

    logger.error("This is Logger 2 Error");
    logger.info("This is Logger 2 Info");
    logger.debug("This is Logger 2 Debug");
    logger.trace("This is Logger 2 Trace");

    // Add Appender
    Appender appender = config.getAppender("Console");
    loggerConfig.addAppender(appender, Level.TRACE, null );
    ctx.updateLoggers();  

    System.out.println("Log Level = " + loggerConfig.getLevel());
    System.out.println("Appenders used in Logger :" + loggerConfig.getAppenders());

    logger.error("This is Logger 3 Error");
    logger.info("This is Logger 3 Info");
    logger.debug("This is Logger 3 Debug");
    logger.trace("This is Logger 3 Trace");

}



/**
 * getUserAppDirectory
 * @return
 */
private String getUserAppDirectory() {
    String workingDirectory;
    String OS = (System.getProperty("os.name")).toUpperCase();  
    if (OS.contains("WIN"))
    {
        //it is simply the location of the "AppData" folder
        workingDirectory = System.getenv("AppData");
    }
    else
    {
        //Otherwise, we assume Linux or Mac
        workingDirectory = System.getProperty("user.home");
        //if we are on a Mac, we are not done, we look for "Application Support"
        workingDirectory += "/Library/Application Support";
    }
    return workingDirectory;
}

public String getLogPath() {
    return logPath;
}

关于java - 如何在 java 中重新加载已编程的 log4j2 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42828748/

相关文章:

java - Jackson 对象映射器在响应中包含转义序列

java - 两个 SharedPreferences 不工作-java

java - JAVA中是否必须实例化List(使用Arraylist)?

java - log4j2 - 根包含无效元素或属性

java - DES 对文件进行加密/解密

java - 有多于一个用户登录的 Wicket session

log4j2 - 以编程方式更改日志级别

log4j2 - 使用 Gradle 构建 JAR 时生成插件 .dat 文件

java - 有人知道如何配置或扩展 lo4j2 以在删除后重新创建日志吗?

java - log4j2.xml 属性替换 ${ } 在 WebLogic 12.2.1 中不起作用