Comment modifier le niveau de consignation root par programme

J’ai le fichier logback.xml suivant:

   %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n       

Maintenant, à l’occurrence d’un événement spécifique, je souhaite modifier par programmation le niveau du consignateur racine du débogage à l’ erreur . Je ne peux pas utiliser la substitution de variables, il est obligatoire de le faire dans le code.

Comment ceci peut être fait ? Merci.

Essaye ça:

 import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; Logger root = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); root.setLevel(Level.INFO); 

Notez que vous pouvez également demander à logback d’parsingr régulièrement votre fichier de configuration comme ceci:

  ...  

Je suppose que vous utilisez logback (du fichier de configuration).

Du manuel de logback , je vois

Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);

Peut-être que cela peut vous aider à changer la valeur?

en utilisant logback 1.1.3 je devais faire ce qui suit (code Scala):

 import ch.qos.logback.classic.Logger import org.slf4j.LoggerFactory ... val root: Logger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME).asInstanceOf[Logger] 

Comme d’autres l’ont fait remarquer, vous créez simplement mockAppender , puis vous créez une instance LoggingEvent qui écoute essentiellement l’événement de journalisation enregistré / qui se produit dans mockAppender .

Voici à quoi cela ressemble dans le test:

 import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.Appender; @RunWith(MockitoJUnitRunner.class) public class TestLogEvent { // your Logger private Logger log = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); // here we mock the appender @Mock private Appender mockAppender; // Captor is generic-ised with ch.qos.logback.classic.spi.LoggingEvent @Captor private ArgumentCaptor captorLoggingEvent; /** * set up the test, runs before each test */ @Before public void setUp() { log.addAppender(mockAppender); } /** * Always have this teardown otherwise we can stuff up our expectations. * Besides, it's good coding practise */ @After public void teardown() { log.detachAppender(mockAppender); } // Assuming this is your method public void yourMethod() { log.info("hello world"); } @Test public void testYourLoggingEvent() { //invoke your method yourMethod(); // now verify our logging interaction // essentially appending the event to mockAppender verify(mockAppender, times(1)).doAppend(captorLoggingEvent.capture()); // Having a generic captor means we don't need to cast final LoggingEvent loggingEvent = captorLoggingEvent.getValue(); // verify that info log level is called assertThat(loggingEvent.getLevel(), is(Level.INFO)); // Check the message being logged is correct assertThat(loggingEvent.getFormattedMessage(), containsSsortingng("hello world")); } } 

Je pense que vous pouvez utiliser MDC pour modifier le niveau de journalisation par programmation. Le code ci-dessous est un exemple pour modifier le niveau de journalisation sur le thread en cours. Cette approche ne crée pas de dépendance pour l’implémentation de la consignation (l’API SLF4J contient MDC).

   LOG_LEVEL DEBUG  TRACE TRACE   DEBUG DEBUG   INFO INFO   WARN WARN   ERROR ERROR   ......  
 MDC.put("LOG_LEVEL", "INFO"); 

Je semble avoir du succès en faisant

 org.jboss.logmanager.Logger logger = org.jboss.logmanager.Logger.getLogger(""); logger.setLevel(java.util.logging.Level.ALL); 

Ensuite, pour obtenir une journalisation détaillée à partir de netty, ce qui suit a été fait

 org.slf4j.impl.SimpleLogger.setLevel(org.slf4j.impl.SimpleLogger.TRACE);