如何在Java中重新加载已编程的log4j2配置 [英] How to reload a programmed log4j2 configuration in java

查看:138
本文介绍了如何在Java中重新加载已编程的log4j2配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

现在我花了一些时间在Java记录器上:log4j2 如果您决定使用.xml文件,则此方法相对容易. 但是,如果您想通过代码创建配置并通过java进行修改,则要复杂一些.

There is now some days that I'm spending on java logger: log4j2 The approach is relatively easy if you decide to work on the basis with an .xml file. But in case you want to create the configuration by code, and adapt through java, it is a bit more complicated.

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

Below the code I could manage for now. I didn't succeed to reconfigure the log level

每个时间深度都停止在错误级别

Each time depth is stopping on error level

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配置吗?

Can you please help to specify how to reload the programmed log4j2 configuration ?

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中重新加载已编程的log4j2配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆