【问题标题】:How to programatically configure appenders or initialize logging in log4j2?如何以编程方式配置附加程序或初始化 log4j2 中的日志记录?
【发布时间】:2014-08-20 18:13:25
【问题描述】:

我一直在尝试以编程方式配置 appender,但到目前为止还没有成功。 我只想配置没有文件的附加程序,以便它可以将日志发送到控制台或文件。

    String PATTERN = "%d [%p|%c|%C{1}] %m%n";
    PatternLayout layout = PatternLayout.createLayout(PATTERN, null, null,
            null, null, null);
    ConsoleAppender console = ConsoleAppender.createAppender(layout, null,
            null, "console", "true", "true"); // create appender

    AppenderRef appender = AppenderRef.createAppenderRef("console",
            "DEBUG", null);

    logger = (Logger) LogManager.getLogger(InitLogger.class);
    LoggerContext context = logger.getContext();
    BaseConfiguration configuration =(BaseConfiguration) context.getConfiguration();
    configuration.addAppender(console);
    logger.addAppender(configuration.getAppender("console"));

【问题讨论】:

  • 您需要重置并将附加程序添加到 rootLogger。见this post
  • 这篇文章谈论的是 log4j1,所以这没有帮助。
  • 这在 log4j2 [link][1] [1] 的 ConfigurationFactory 的帮助下成为可能:stackoverflow.com/questions/20886717/…

标签: java logging log4j2


【解决方案1】:

试试下面的示例代码

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.config.AppenderRef;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.spi.ExtendedLogger;
import org.apache.logging.log4j.spi.LoggerContext;

public class TestLog4j2 {

    public static void main(String[] args) {
        try {

            ConsoleAppender console = ConsoleAppender.createAppender(PatternLayout.createDefaultLayout(), null, "SYSTEM_OUT", "console", null, null);
             final LoggerContext ctx = (LoggerContext) new org.apache.logging.log4j.core.LoggerContext("console" );
                final Configuration config = ((org.apache.logging.log4j.core.LoggerContext) ctx).getConfiguration();
                console.start();
                config.addAppender(console);
                AppenderRef ref = AppenderRef.createAppenderRef("console", null, null);
                AppenderRef[] refs = new AppenderRef[] {ref};
                LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.ALL, "org.apache.logging.log4j",
                    "true", refs, null, config, null );
                loggerConfig.addAppender(console, null, null);
                config.addLogger("org.apache.logging.log4j", loggerConfig);
                ((org.apache.logging.log4j.core.LoggerContext) ctx).updateLoggers();
                ExtendedLogger logger = (ExtendedLogger) ctx.getLogger("console");
                logger.error("abc");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

【讨论】:

    【解决方案2】:

    这是最简单的方法:

    import org.apache.logging.log4j.Level;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.apache.logging.log4j.core.LoggerContext;
    import org.apache.logging.log4j.core.appender.ConsoleAppender;
    import org.apache.logging.log4j.core.config.AbstractConfiguration;
    import org.apache.logging.log4j.core.config.AppenderRef;
    import org.apache.logging.log4j.core.config.LoggerConfig;
    import org.apache.logging.log4j.core.layout.PatternLayout;
    
    public class Main {
    
        public static void main(String[] args) {
            configure();
            Logger logger = LogManager.getLogger("com.company");
            logger.trace("Hello Word!");
    
        }
    
        public static void configure() {
            LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
            AbstractConfiguration config = (AbstractConfiguration) ctx.getConfiguration();
            ConsoleAppender appender = ConsoleAppender.createDefaultAppenderForLayout(PatternLayout.createDefaultLayout());
            appender.start();
            config.addAppender(appender);
            AppenderRef[] refs = new AppenderRef[] { AppenderRef.createAppenderRef(appender.getName(), null, null) };
            LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.ALL, LogManager.ROOT_LOGGER_NAME, "true", refs, null, config, null);
            loggerConfig.addAppender(appender, null, null);
            config.addLogger(LogManager.ROOT_LOGGER_NAME, loggerConfig);
            ctx.updateLoggers();
        }
    }
    

    【讨论】:

    • 如何让这个记录器异步?
    • @Paul 如何重启使用上述配置创建的 appender?
    猜你喜欢
    • 2017-02-03
    • 2015-02-14
    • 2014-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2019-05-03
    相关资源
    最近更新 更多