Как изменить уровень корневого ведения журнала программно
У меня есть следующий 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>
теперь, при наступлении определенного события, я хочу программно изменить уровень корневого регистратора от debug до . Я не могу использовать подстановку переменных, это обязательно, что я делаю это в коде.
Как это можно сделать ? Спасибо.
6 ответов:
попробуйте это:
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 scan="true" scanPeriod="30 seconds" > ... </configuration>
Я предполагаю, что вы используете logback (из файла конфигурации).
С logback manual Я вижу
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]
как указывали другие, вы просто создаете
mockAppenderа затем создатьLoggingEventэкземпляр, который по существу слушает зарегистрированное событие регистрации / происходит внутриmockAppender.вот как это выглядит в тест:
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 для изменения уровня ведения журнала программно. Приведенный ниже код является примером изменения уровня ведения журнала в текущем потоке. Этот подход не создает зависимость от реализации 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");
Кажется, я добиваюсь успеха
org.jboss.logmanager.Logger logger = org.jboss.logmanager.Logger.getLogger(""); logger.setLevel(java.util.logging.Level.ALL);затем, чтобы получить подробное ведение журнала от netty, следующее сделало это
org.slf4j.impl.SimpleLogger.setLevel(org.slf4j.impl.SimpleLogger.TRACE);
Comments