Hi Mike, in our app we implemented a REST-Service to reconfigure log4j2 at runtime.
It's mainly to apply changes to the configuration and call updateLoggers() LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false); Configuration configuration = loggerContext.getConfiguration(); LoggerConfig loggerConfig = configuration.getLoggerConfig(loggerName); LoggerConfig specificConfig = loggerConfig; if (!loggerConfig.getName().equals(loggerName)) { specificConfig = new LoggerConfig(loggerName, level, true); specificConfig.setParent(loggerConfig); configuration.addLogger(loggerName, specificConfig); } specificConfig.setLevel(level); loggerContext.updateLoggers(); see attachment for our full Log4j2Util code. Regards, Volker 2018-02-08 21:28 GMT+01:00 Mike Kienenberger <mkien...@gmail.com>: > As others have reported in years past, the examples in the docs for > > Programmatically Modifying the Current Configuration after Initialization > > are out of date. They don't compile. They don't work (affect the > existing logging) even if you do fix the errors. > > Here's my situation: > > I am working in an environment with EVIL.JAR which includes a log4j2.xml > file. > I can't change the jar. I can't specific a System Property to override it. > > My code gets called as a loaded module long after the logging system > is initialized. > > I want logging in my own code to go to a different location, and > preferably I'd like to read the configuration in from a log4j2.xml > file so that anyone who uses my module isn't victim to the same evil > hardcoded-logging practices of EVIL.JAR. > > Creating an XMLConfiguration and initializing it lets me read the xml > file easily enough. Looping through the data gets me the Appenders, > Filters and Loggers. But I still can't use them to modify the > existing configuration. > > Another person took the approach of using JUL instead. I hate JUL and > I'd really rather not have to go down that route. > > Thanks in advance. > -Mike > > --------------------------------------------------------------------- > To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org > For additional commands, e-mail: log4j-user-h...@logging.apache.org > > -- inexso - information exchange solutions GmbH Ofener Straße 30 | 26121 Oldenburg www.inexso.de
package de.inexso.commons.logging; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.appender.AbstractAppender; import org.apache.logging.log4j.core.appender.ConsoleAppender; import org.apache.logging.log4j.core.appender.FileAppender; 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.slf4j.Logger; import org.slf4j.LoggerFactory; public class Log4j2Util { private static final Logger LOG = LoggerFactory.getLogger(Log4j2Util.class); public static void setLoggerLevel(String loggerName, String levelName) throws IllegalArgumentException { Level level = toLevel(levelName); setLoggerLevel(loggerName, level); } public static Level toLevel(String levelName) throws IllegalArgumentException { Level level = Level.toLevel(levelName, null); if (level == null) { throw new IllegalArgumentException("Unknown levelName \"" + levelName + "\""); } return level; } public static void setLoggerLevel(Configuration configuration, String loggerName, String levelName) throws IllegalArgumentException { setLoggerLevel(configuration, loggerName, toLevel(levelName)); } public static void setLoggerLevel(String loggerName, Level level) { LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false); Configuration configuration = loggerContext.getConfiguration(); setLoggerLevel(configuration, loggerName, level); loggerContext.updateLoggers(); } public static void setLoggerLevel(Configuration configuration, String loggerName, Level level) { LoggerConfig loggerConfig = configuration.getLoggerConfig(loggerName); LoggerConfig specificConfig = loggerConfig; if (!loggerConfig.getName().equals(loggerName)) { specificConfig = new LoggerConfig(loggerName, level, true); specificConfig.setParent(loggerConfig); configuration.addLogger(loggerName, specificConfig); } specificConfig.setLevel(level); } public static void replaceRootAppender(Configuration configuration, String appenderName, String logFileName, String logLayout) { AbstractAppender logAppender; if ("STDOUT".equalsIgnoreCase(logFileName)) { logAppender = ConsoleAppender.newBuilder() .withLayout(PatternLayout.newBuilder().withPattern(logLayout).build()) .withName(appenderName) .build(); } else { logAppender = FileAppender.newBuilder() .withFileName(logFileName) .withAppend(true) .withLayout(PatternLayout.newBuilder().withPattern(logLayout).build()) .withName(appenderName) .build(); } logAppender.start(); LoggerConfig rootLogger = configuration.getRootLogger(); rootLogger.removeAppender(appenderName); rootLogger.addAppender(logAppender, null, null); } public static void createFileAppender(String name, String fileName, String pattern) { LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false); Configuration configuration = loggerContext.getConfiguration(); FileAppender fileAppender = FileAppender.newBuilder() .withFileName(fileName) .withAppend(true) .withLayout(PatternLayout.newBuilder().withPattern(pattern).build()) .withName(name) .build(); configuration.addAppender(fileAppender); loggerContext.updateLoggers(); } public static void createLogger(String name, String level, boolean additive, String appenderName) { LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false); if (loggerContext.hasLogger(name)) { LOG.warn("logger \"{}\" already exists!", name); } Configuration configuration = loggerContext.getConfiguration(); LoggerConfig loggerConfig = new LoggerConfig(name, toLevel(level), true); loggerConfig.setAdditive(additive); loggerConfig.addAppender(configuration.getAppender(appenderName), null, null); configuration.addLogger(name, loggerConfig); loggerContext.updateLoggers(); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org For additional commands, e-mail: log4j-user-h...@logging.apache.org