2014-04-23 12 views
22

Log4J consente di passare il livello desiderato per accedere a determinati logger dell'applicazione per la riga di comando, ad es. "-Dlog4j.logger.com.whatever.MyClass = DEBUG". Non riesco a trovare alcuna funzione simile in Logback. Secondo le FAQ, tutto ciò che ti permette di fare è impostare il livello per il root logger usando la sostituzione delle variabili. C'è qualcosa che mi manca o Logback non supporta questo? Grazie.È possibile configurare i livelli del logger di logback sulla riga di comando?

risposta

17

Sì, sembra che non ci sia tale caratteristica. Come ho capito, è in parte dovuto al fatto che la configurazione di logback è più complessa, quindi è piuttosto difficile ottenere una flessibilità di configurazione ragionevole con proprietà di stringa piatta. Parte perché, imho, incoraggia le cattive pratiche - posizionando troppe proprietà di sistema - porta a script di esecuzione o linee di comando ingombranti, più difficili da gestire rispetto ai file di configurazione di registrazione separati.

Tuttavia ho potuto suggerire diverse opzioni:

  • uso $ {} sys.prop.var.name sostituzioni nel file di configurazione logback.xml
  • copia logback.xml localmente, modificare con i livelli desiderati logger e specificare -Dlogback.configurationFile=/path/to/customised/logback.xml. Tieni presente che "Logback-classic può eseguire la scansione delle modifiche nel file di configurazione e riconfigurarsi automaticamente quando il file di configurazione cambia". Quindi, non è nemmeno necessario riavviare il processo per modificare i livelli di registrazione.
  • FAI DA TE: aggiungere un codice nell'applicazione in grado di leggere le proprietà del sistema e applicare le proprietà ai livelli di registrazione all'avvio.
+0

Ho appena aggiunto il codice per il fai da te in una risposta separata (http://stackoverflow.com/questions/23253916/is-it-possible-to-configure-logback-logger-levels-on- la-riga di comando/32603032 # 32603032) –

1

Come indicato nel FAQ:

Logback non consente la registrazione di essere disattivato dalla riga di comando. Tuttavia, se il file di configurazione lo consente, è possibile impostare il livello dei logger sulla riga di comando tramite una proprietà di sistema Java.

Così come @kan menzionato in precedenza, è necessario utilizzare altre opzioni.

6

So che questa è una vecchia domanda, ma qui è il mio codice soluzione per inizializzare i livelli di Logback Logger da SysProps, se qualcuno ne ha bisogno. Nota che recupera Logback Logger usando LoggerFactory di Slf4j. Usa un lambda Java 8 ma potrebbe essere facilmente tradotto in Java 7 o meno.

È sufficiente aggiungere SysPropLogbackConfigurator.applyOnce() all'inizio del metodo main. Se chiamato più volte, l'inizializzatore statico impedirà la ri-scansione delle proprietà.

package com.yourpackage; 

import org.slf4j.LoggerFactory; 
import ch.qos.logback.classic.Level; 

/** 
* Looks into System.properties for props -DLOG.loggerName=LEVEL to set Logback levels at startup 
* If LEVEL is empty (setting -DLOG.loggerName without level), it erases a previously set level and will inherit from parent logger 
*/ 
public class SysPropLogbackConfigurator { 

    public static final String PROP_PREFIX = "LOG."; 

    public static void apply() { 
     System.getProperties().stringPropertyNames().stream().filter(name -> name.startsWith(PROP_PREFIX)).forEach(SysPropLogbackConfigurator::applyProp); 
    } 

    public static void applyOnce() { 
     OnceInitializer.emptyMethodToForceInit();//force static init. applySysPropsToLogback will be called only once 
    } 

    private static void applyProp(final String name) { 
     final String loggerName = name.substring(PROP_PREFIX.length()); 
     final String levelStr = System.getProperty(name, ""); 
     final Level level = Level.toLevel(levelStr, null); 
     ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(loggerName)).setLevel(level); 
    } 

    private static class OnceInitializer { 
     static { 
      apply(); 
     } 

     static void emptyMethodToForceInit() { 
     }; 
    } 
}