首页 > 解决方案 > 如何基于多个动态参数在 Log4j2 中以编程方式创建多个日志文件?

问题描述

有没有办法基于多个动态参数在 Log4j2 中以编程方式创建多个日志文件?例如,对于输入参数“abc”,程序应该创建“abc.log”,对于输入参数“xyz”,它应该创建“xyz.log”。动态参数的数量是事先不知道的。动态参数的数量也没有限制。

例如,以下动态方法适用于较旧的 Log4j 1.2。需要您的帮助才能在 Log4j2 中提出一个简单的等效方法。谢谢。

    /**
     * Equivalent Log4j 1.2 code for REFERENCE PURPOSES ONLY
     */
    public static Logger getDynamicLogger(String parameter){
        Logger logger = null;
        try {
            SimpleLayout layout = new SimpleLayout();
            RollingFileAppender appender = null;
            logger = Logger.getLogger(parameter);
            String path = "/opt/logs/";
            appender = new RollingFileAppender(layout, path + parameter+".log", true);
            logger.addAppender(appender);
            appender.setImmediateFlush(true);
            appender.setMaxBackupIndex(1);
            appender.setMaximumFileSize(1000000);
            logger.setAdditivity(false);
        }
        catch(IOException e) {
            throw new RuntimeException("Error while creating dynamic logger",e);
        }
        return logger;
    }

标签: log4jlog4j2

解决方案


有一个RoutingAppender为Log4j 2.x FAQ中记录的动态日志记录要求提供支持。但是,鉴于要求不同,以下方法很有用。

    public static Logger getLogger(String parameter){
        String path = "/opt/logs/";
        final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        final Configuration config = ctx.getConfiguration();

        SizeBasedTriggeringPolicy policy = SizeBasedTriggeringPolicy.createPolicy("10MB");
        DefaultRolloverStrategy strategy = DefaultRolloverStrategy.createStrategy("20", "1", null, null, null, false, config);
        PatternLayout layout = PatternLayout.newBuilder().withConfiguration(config).withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN).build();

        Appender appender = RollingFileAppender.createAppender(path+parameter+".log", path+parameter+"-%i.log",
                "true", parameter, "true", "128", "true", policy, strategy, layout, (Filter) null, "false", "false", (String) null, config);

        appender.start();
        config.addAppender(appender);

        AppenderRef ref = AppenderRef.createAppenderRef(parameter, null, null);
        AppenderRef[] refs = new AppenderRef[] {ref};
        LoggerConfig loggerConfig = LoggerConfig.createLogger(false, Level.INFO, parameter, "true", refs, null, config, null );
        loggerConfig.addAppender(appender, null, null);
        config.addLogger(parameter, loggerConfig);
        ctx.updateLoggers();
        return LogManager.getLogger(parameter);
    }

推荐阅读