2017-01-27 8 views
2

Я хотел бы иметь возможность динамически изменять уровень фильтрации для одного Appender в LogbackДинамически сменить фильтр для приложения регистрации журналов?

Например, если у меня есть

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%d [%X{traceId}] [%thread] %-5level %logger{36} %marker - %msg%n</pattern> 
    </encoder> 
</appender> 

<!-- Root Config --> 
<root level="${log_level:-INFO}"> 
    <appender-ref ref="ASYNC-SERVICE"/> 
    <appender-ref ref="STDOUT"/> 
</root> 

Как можно во время выполнения изменить Appender STDOUT, чтобы разрешить отладку против Информация?

я могу изменить глобально корневой уровень легко:

def setLogLevel(value: Level, loggerName: String = org.slf4j.Logger.ROOT_LOGGER_NAME) = { 
    val logger = LoggerFactory.getLogger(loggerName).asInstanceOf[Logger] 

    logger.setLevel(LogbackLevel.valueOf(value.toString)) 
} 

Но я бы очень хотел, чтобы иметь контроль, на котором Appender получает какой уровень динамически.

Я пытался манипулировать фильтры уровня на appenders, но это, похоже, не делать

+0

Вы когда-нибудь находили решение этого вопроса? Я сижу с тем же вопросом. Я хочу, чтобы уровень корневого регистратора был разрешительным, например. TRACE, а затем за приложение, контролирует, какой уровень регистрируется. Я попробовал очистить и снова добавить фильтры в приложение, но это не сработает. – Will777

+0

@ Will777 см. Мой ответ – devshorts

ответ

1

То, что я в конечном итоге делаю имели корневой уровень всегда необходимо войти в Debug и обеспечивает пороговые фильтры для каждого Appender:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
      <level>INFO</level> 
    </filter> 
    <encoder> 
     <pattern>%d [%X{traceId}] [%thread] %-5level %logger{36} %marker - %msg%n</pattern> 
    </encoder> 
</appender> 

<!-- Root Config --> 
<root level="${log_level:-DEBUG}"> 
    <appender-ref ref="ASYNC-SERVICE"/> 
    <appender-ref ref="STDOUT"/> 
</root> 

Тогда я использовал класс ConfigurationDelegate от заводной Logback API для запроса appenders

val context = LoggerFactory.getILoggerFactory.asInstanceOf[LoggerContext] 

val configuration = { 
    val delegate = new ConfigurationDelegate 
    delegate.setContext(context) 
    delegate 
    } 

    /** 
    * Sets the log level for a particular appender 
    * @param value 
    * @param appenderName 
    */ 
    def setAppenderLevel(value: Level, appenderName: String) = { 
    appenders.find(_.getName == appenderName) match { 
     case Some(appender) => 
     val filters = appender.getCopyOfAttachedFiltersList 

     filters.find(_.isInstanceOf[ThresholdFilter]).foreach(m => m.asInstanceOf[ThresholdFilter].setLevel(value.toString)) 
     case None => 
    } 
    } 

И я искал threshh старый фильтр и установите значение вручную.

+0

Фантастический, спасибо за сообщение! Я начал общаться с этой прошлой ночью, я пошел тем же путем - я не мог понять, как получить текущий набор фильтров для каждого appender - ваш пост помогает много. Я пошел с LevelFilters вместо ThresholdFilters. Моя первоначальная проблема заключалась в том, что вы должны вызывать start() в фильтре, иначе это не вступит в силу. – Will777