代码之家  ›  专栏  ›  技术社区  ›  Kashyap

在运行时更新log4j2模式

  •  1
  • Kashyap  · 技术社区  · 7 年前

    Lambda.handle() )这是用一个参数调用的 id

    我读过:

    以下代码基于log4j2文档。它打印:

    INIT  MyLogger handle() - id ONE 
    INIT  MyLogger handle() - id TWO 
    INIT  MyLogger handle() - id THR 
    

    如果我把评论删掉 initLoggerConfig("INIT "); 然后打印:

    ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2
    ONE  MyLogger handle() - id ONE 
    ONE  MyLogger handle() - id TWO 
    ONE  MyLogger handle() - id THR 
    

    我想把它打印出来:

    ONE  MyLogger handle() - id ONE 
    TWO  MyLogger handle() - id TWO 
    THR  MyLogger handle() - id THR 
    

    ctxLocal = ctx; ,没有效果。

    这里是 the full log builder.setStatusLevel(Level.ALL); )

    这是密码

    package foobar;
    
    import java.util.Arrays;
    import java.util.List;
    
    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.Filter;
    import org.apache.logging.log4j.core.Layout;
    import org.apache.logging.log4j.core.LoggerContext;
    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.Configurator;
    import org.apache.logging.log4j.core.config.LoggerConfig;
    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.impl.BuiltConfiguration;
    import org.apache.logging.log4j.core.layout.PatternLayout;
    
    class Lambda {
      private static final String LOGGER_NAME = "MyLogger";
      private LoggerContext ctx;
    
      public Lambda() {
        initLoggerConfig("INIT ");
      }
    
      public void handle(String id) {
        updateLoggerConfig(id);
        Logger logger = LogManager.getLogger(LOGGER_NAME);
        logger.error("handle() - id {}", id);
      }
    
      private void updateLoggerConfig(String prefix) {
        final LoggerContext ctxLocal = (LoggerContext) LogManager.getContext(false);
        // ctxLocal = ctx;
        Configuration config = ctxLocal.getConfiguration();
        Layout<String> layout = PatternLayout.newBuilder().withPattern(prefix + " %c %m\n").withConfiguration(config)
            .build();
        Appender appender = ConsoleAppender.createDefaultAppenderForLayout(layout);
        appender.start();
        config.addAppender(appender);
        AppenderRef ref = AppenderRef.createAppenderRef("File", null, null);
        AppenderRef[] refs = new AppenderRef[] { ref };
        LoggerConfig loggerConfig = LoggerConfig.createLogger(false, Level.ALL, getClass().getName(), "true", refs, null,
            config, null);
        loggerConfig.addAppender(appender, null, null);
        config.addLogger(LOGGER_NAME, loggerConfig);
        ctxLocal.updateLoggers();
      }
    
      void initLoggerConfig(String prefix) {
        ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
        builder.setStatusLevel(Level.ERROR);
        builder.setConfigurationName("BuilderTest");
        builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL).addAttribute("level",
            Level.DEBUG));
        AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").addAttribute("target",
            ConsoleAppender.Target.SYSTEM_OUT);
        appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", prefix + " %c %m\n"));
        appenderBuilder.add(
            builder.newFilter("MarkerFilter", Filter.Result.DENY, Filter.Result.NEUTRAL).addAttribute("marker", "FLOW"));
        builder.add(appenderBuilder);
        builder.add(builder.newLogger(LOGGER_NAME, Level.ALL).add(builder.newAppenderRef("Stdout"))
            .addAttribute("additivity", false));
        builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
        ctx = Configurator.initialize(builder.build());
      }
    }
    
    public class TestMain {
      static Lambda lamb = new Lambda();
      private static Logger logger = LogManager.getLogger();
    
      public static void main(String[] args) {
        Configurator.setLevel(logger.getName(), Level.ALL);
        List<String> a = Arrays.asList("ONE ", "TWO ", "THR ");
        for (String i : a) {
          lamb.handle(i);
        }
    
      }
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Andre    7 年前

    使用D.B建议的查找,这就是我修复它的方法。

    在PatternLayout中添加对“variable”的引用,在下面的示例中,我将其命名为MyVarialbe(您需要使用与%X{}完全相同的语法:

    appenderBuilder.add(builder.newLayout(“PatternLayout”) .addAttribute(“模式”,” %X{MyVariable} %消息%n%throwable“);

    org.apache.logging.log4j.ThreadContext.put(“MyVariable”,extraInfo);

    以编程方式使用log4j2很复杂。由于我有同样的困难,这篇文章是3个月前,希望这个答案将有助于其他人。