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
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.
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.
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() {
};
}
}
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) –