2017-01-27 2 views
2

Ich möchte in der Lage sein, dynamisch für ein einzelnes appender in logback die Filterstufe zu ändernFilter für Logback Appender dynamisch ändern?

Zum Beispiel, wenn ich

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

habe Wie kann ich zur Laufzeit des STDOUT- appender Debug zu ermöglichen ändern vs Info?

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

Aber ich möchte wirklich Kontrolle haben, auf dem Appen die dynamisch Ebene bekommt:

kann ich global die Root-Ebene leicht ändern.

Ich habe versucht, auf der Appen Ebene Filter zu manipulieren, aber das schien nicht viel zu tun

+0

Haben Sie jemals eine Lösung gefunden? Ich sitze mit demselben Problem. Ich möchte, dass die Root-Logger-Ebene permissiv ist, z. TRACE, dann pro Appender, steuern, welche Ebene protokolliert wird. Ich habe versucht, die Filter auf dem Appender wieder zu löschen und hinzuzufügen, aber es funktioniert nicht. – Will777

+0

@ Will777 sehe meine Antwort – devshorts

Antwort

1

Was ich immer die Wurzel hatte am Ende tue Ebene bei Debug-Log und Schwellen Filter für jeden appender bieten:

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

Dann habe ich die ConfigurationDelegate Klasse aus dem groovy logback api die Appen

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 => 
    } 
    } 

Und ich suchte nach dem threshh abfragen alter Filter und setze den Wert von Hand.

+0

Fantastisch, danke für die Veröffentlichung! Ich habe letzte Nacht damit angefangen, herumzubasteln, ich bin den gleichen Weg gegangen - ich konnte nicht herausfinden, wie man die aktuellen Filter an jedem Appender bekommt - dein Beitrag hilft sehr. Ich bin mit LevelFilters anstelle von ThresholdFilters gegangen. Mein erstes Problem war, dass Sie start() auf dem Filter aufrufen müssen, sonst wird es nicht wirksam. – Will777

Verwandte Themen