[Log4j2] Avoir 2 appender sur le même package et modifier le niveau à la volée
Bonjour,
Je suis confronté à un besoin que je n'arrive pas à résoudre avec Log4j2
Je souhaiterais pouvoir loguer sur un même package dans la console et dans un fichier et pouvoir modifier programmatiquement le niveau de chacun de ces loggers
Voici mon fichier de configuration :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout
pattern="%d{ISO8601} %-5level %30.30logger{1.}:%-3L - %m%n%throwable" />
</Console>
<RollingFile name="RollingFile" fileName="/logs/TestLog.log"
filePattern="/logs/$${date:yyyy-MM}/TestLog-%d{MM-dd-yyyy}-%i.log.gz">
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
<PatternLayout
pattern="%d{ISO8601} %-5level %30.30logger{1.}:%-3L - %m%n%throwable" />
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.test.test" level="error" additivity="true">
<AppenderRef ref="RollingFile" />
</Logger>
<Logger name="com.test" level="error" additivity="false">
<AppenderRef ref="STDOUT" />
</Logger>
<Root level="error">
</Root>
</Loggers>
</Configuration> |
Et mon code qui reprogramme le niveau de log :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| package com.test.test;
import java.io.File;
import java.net.URI;
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.config.Configuration;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.LoggerConfig;
public class TestLogging {
private static final String LOGGER_FILE = "com.test.test";
private static final String LOGGER_CONSOLE = "com.test";
public static void reloadConfiguration(String log4jConfPath, String logFilePath) {
// Init
URI source = new File(log4jConfPath).toURI();
Configurator.initialize("contextLog4J", null, source);
LogManager.getLogger().debug("1 - Logger configuration reloaded");
LogManager.getLogger().error("1 - Logger configuration reloaded");
// Update level on file appender
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration config = ctx.getConfiguration();
LoggerConfig loggerConfig = config.getLoggerConfig(LOGGER_FILE);
LoggerConfig loggerConfigRoot = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);
loggerConfig.setLevel(Level.DEBUG);
loggerConfigRoot.setLevel(Level.DEBUG);
ctx.updateLoggers();
LogManager.getLogger().debug("2 - Logger configuration reloaded");
LogManager.getLogger().error("2 - Logger configuration reloaded");
// Update level on console appender
ctx = (LoggerContext) LogManager.getContext(false);
config = ctx.getConfiguration();
LoggerConfig loggerConfigConsole = config.getLoggerConfig(LOGGER_CONSOLE);
loggerConfigConsole.setLevel(Level.DEBUG);
ctx.updateLoggers();
LogManager.getLogger().debug("3 - Logger configuration reloaded");
LogManager.getLogger().error("3 - Logger configuration reloaded");
}
} |
J'obtiens ceci dans le SystemOut et dans le fichier de log :
Code:
1 2 3 4 5
| 2014-06-06 11:09:44,041 ERROR c.t.t.TestLogging:25 - 1 - Logger configuration reloaded
2014-06-06 11:09:44,044 DEBUG c.t.t.TestLogging:36 - 2 - Logger configuration reloaded
2014-06-06 11:09:44,045 ERROR c.t.t.TestLogging:37 - 2 - Logger configuration reloaded
2014-06-06 11:09:44,045 DEBUG c.t.t.TestLogging:46 - 3 - Logger configuration reloaded
2014-06-06 11:09:44,045 ERROR c.t.t.TestLogging:47 - 3 - Logger configuration reloaded |
Alors que je souhaiterais obtenir dans la console :
Code:
1 2 3 4
| 2014-06-06 11:09:44,041 ERROR c.t.t.TestLogging:25 - 1 - Logger configuration reloaded
2014-06-06 11:09:44,045 ERROR c.t.t.TestLogging:37 - 2 - Logger configuration reloaded
2014-06-06 11:09:44,045 DEBUG c.t.t.TestLogging:46 - 3 - Logger configuration reloaded
2014-06-06 11:09:44,045 ERROR c.t.t.TestLogging:47 - 3 - Logger configuration reloaded |
Une idée de comment réaliser correctement cette reprogrammation à la volée avec Log4j2 ?
Merci