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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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