Log4j2 как перезаписать путь в конфигурации log4j2.xml ?

#java #logging

#java #ведение журнала

Вопрос:

Я должен сохранить журналы по пути, взятому из базы данных. Я знаю, что журналы начинаются раньше. Для этого в xml у меня есть конфигурация пути, но я хочу, чтобы путь был перезаписан после загрузки данных из базы данных.

         LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        Configuration config = ctx.getConfiguration();
        Layout layout = PatternLayout.createLayout("test[%t] %-5level %C %M: %msg%n", config, null, null, false, false, null, null );
        SizeBasedTriggeringPolicy policy = SizeBasedTriggeringPolicy.createPolicy("10M");
        DefaultRolloverStrategy strategy = DefaultRolloverStrategy.createStrategy(null, "0", null, null, config);
        RollingFileAppender appender = RollingFileAppender.createAppender(logDir, rollLogDir   "${date:yyyy-MM}/test-%d{MM-dd-yyyy}-%i.log.gz", "true",
                "RollingFileAppender", "true", "128", "true", policy, strategy, layout, null, "true", "false",  "false", config);
        appender.start();
        config.addAppender(appender);
        AppenderRef ref = AppenderRef.createAppenderRef("File", Level.INFO, null);
        AppenderRef[] refs = new AppenderRef[] { ref };
        LoggerConfig loggerConfig = LoggerConfig.createLogger("true", Level.INFO, LogManager.ROOT_LOGGER_NAME, "true",
                refs, null, config, null);
        loggerConfig.addAppender(appender, Level.INFO, null);
        config.addLogger(LogManager.ROOT_LOGGER_NAME, loggerConfig);
        ctx.updateLoggers();
 

Log4j2.xml

 <Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="test[%t] %-5level %C %M: %msg%n"/>
        </Console>
        <RollingFile name="RollingFileAppender" fileName="logs/server1/testtowy.log"
              filePattern="logs/server1/${date:yyyy-MM}/test-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d [%t] %p %c - %m%n"/>
            <Policies>
                <OnStartupTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
            <DefaultRolloverStrategy max="1000" />
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="org.hibernate.SQL" level="debug" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>
        <Logger name="com.test.test" level="info" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>
        <Root level="error">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Root>
    </Loggers>
</Configuration>
 

Ответ №1:

Взгляните на программную конфигурацию

Мое предложение не имело бы никакого Log4j2.xml ведение журнала, просто добавьте новый для журналов вашего приложения. Что-то вроде:

         final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        final Configuration config = ctx.getConfiguration();
        Layout layout = PatternLayout.createLayout(PatternLayout.SIMPLE_CONVERSION_PATTERN, config, null,
            null,null, null);
        Appender appender = FileAppender.createAppender("target/test.log", "false", "false", "File", "true",
            "false", "false", "4000", layout, null, "false", null, config);
        appender.start();
        config.addAppender(appender);
        AppenderRef ref = AppenderRef.createAppenderRef("File", null, null);
        AppenderRef[] refs = new AppenderRef[] {ref};
        LoggerConfig loggerConfig = LoggerConfig.createLogger("false", "info", "org.apache.logging.log4j",
            "true", refs, null, config, null );
        loggerConfig.addAppender(appender, null, null);
        config.addLogger("org.apache.logging.log4j", loggerConfig);
        ctx.updateLoggers();