studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java logging logback

java - programacion - Cómo cambiar el nivel de registro de raíz mediante programación



manual de programacion android pdf (6)

Como señalaron otros, simplemente mockAppender y luego LoggingEvent una instancia de LoggingEvent que esencialmente escucha el evento de registro registrado / ocurre dentro de mockAppender .

Así es como se ve en la prueba:

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<ILoggingEvent> mockAppender; // Captor is generic-ised with ch.qos.logback.classic.spi.LoggingEvent @Captor private ArgumentCaptor<LoggingEvent> 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(), containsString("hello world")); } }

Tengo el siguiente archivo logback.xml:

<configuration debug="true"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="STDOUT" /> </root> </configuration>

Ahora, ante la ocurrencia de un evento específico, quiero cambiar programáticamente el nivel del registrador raíz de la depuración al error . No puedo usar la sustitución de variables, es obligatorio que haga esto dentro del código.

Cómo puede hacerse esto ? Gracias.


Creo que puede usar MDC para cambiar el nivel de registro programáticamente. El siguiente código es un ejemplo para cambiar el nivel de registro en el hilo actual. Este enfoque no crea dependencia a la implementación de logback (SLF4J API contiene MDC).

<configuration> <turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter"> <Key>LOG_LEVEL</Key> <DefaultThreshold>DEBUG</DefaultThreshold> <MDCValueLevelPair> <value>TRACE</value> <level>TRACE</level> </MDCValueLevelPair> <MDCValueLevelPair> <value>DEBUG</value> <level>DEBUG</level> </MDCValueLevelPair> <MDCValueLevelPair> <value>INFO</value> <level>INFO</level> </MDCValueLevelPair> <MDCValueLevelPair> <value>WARN</value> <level>WARN</level> </MDCValueLevelPair> <MDCValueLevelPair> <value>ERROR</value> <level>ERROR</level> </MDCValueLevelPair> </turboFilter> ...... </configuration>

MDC.put("LOG_LEVEL", "INFO");


Parece que estoy teniendo éxito haciendo

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

Luego, para obtener un registro detallado de Netty, lo siguiente lo ha hecho

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


Prueba esto:

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);

Tenga en cuenta que también puede indicarle a logback que escanee periódicamente su archivo de configuración de esta manera:

<configuration scan="true" scanPeriod="30 seconds" > ... </configuration>


Supongo que estás usando logback (desde el archivo de configuración).

Del manual de logback , veo

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

Tal vez esto puede ayudarlo a cambiar el valor?


usando logback 1.1.3 tuve que hacer lo siguiente (código de Scala):

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