I have to save the logs to the path taken from the database. I know the logs start earlier. For this, in xml I have a path configuration, but I want the path to be overwritten after downloading data from the database.
JavaScript
x
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
JavaScript
<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>
Advertisement
Answer
Take a look at Programmatic Configuration…
My suggestion would have no Log4j2.xml logging, just add a new one for your app logs. Something like:
JavaScript
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();