如何以编程方式更改根日志logging级别

我有以下的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> 

现在,在发生特定事件时,我想以编程方式将根logging器的级别从debugging更改为错误 。 我不能使用variablesreplace,在代码中这是强制性的。

如何做呢 ? 谢谢。

尝试这个:

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

请注意,您也可以通过logback来定期扫描您的configuration文件,如下所示:

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

我假设你正在使用logback(从configuration文件)。

从logback手册 ,我明白了

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

也许这可以帮助你改变价值?

使用logback 1.1.3我不得不做下面的事情(Scala代码):

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

正如其他人所指出的那样,您只需创buildmockAppender ,然后创build一个LoggingEvent实例,该实例基本上监听mockAppenderlogging/发生的日志logging事件。

下面是它在testing中的样子:

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

我认为你可以使用MDC以编程方式更改日志级别。 下面的代码是更改当前线程日志logging级别的示例。 这种方法不会创build对logback实现的依赖(SLF4J API包含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");