web-dev-qa-db-fra.com

Est-il possible de configurer les niveaux d'enregistreur de déconnexion sur la ligne de commande?

Log4J vous permet de passer le niveau auquel vous souhaitez que des enregistreurs particuliers dans votre application se connectent à partir de la ligne de commande, par exemple "-Dlog4j.logger.com.wwhat.MyClass = DEBUG". Je ne trouve aucune installation similaire dans Logback. Selon la FAQ, tout ce qu'il semble vous permettre de faire est de définir le niveau de l'enregistreur racine en utilisant la substitution de variables. Y a-t-il quelque chose qui me manque ou est-ce que Logback ne le supporte tout simplement pas? Merci.

30
bfancher

Oui, il semble qu'il n'y ait pas une telle fonctionnalité. Si je comprends bien, c'est en partie parce que cette configuration de déconnexion est plus complexe, donc assez difficile à obtenir une flexibilité de configuration raisonnable par des propriétés de chaîne plate. En partie parce que, à mon humble avis, cela encourage les mauvaises pratiques - placer trop de propriétés système - conduit à des scripts d'exécution ou des lignes de commande gonflés, plus difficiles à gérer que des fichiers de configuration de journalisation séparés.

Cependant, je pourrais suggérer plusieurs options:

  • utilisation ${sys.prop.var.name} substitutions dans votre fichier de configuration logback.xml
  • copiez logback.xml localement, modifiez-le avec les niveaux d'enregistreur souhaités et spécifiez -Dlogback.configurationFile=/path/to/customised/logback.xml. Gardez à l'esprit que "Logback-classic peut rechercher les modifications dans son fichier de configuration et se reconfigurer automatiquement lorsque le fichier de configuration change". Ainsi, vous n'avez même pas besoin de relancer votre processus pour modifier les niveaux de journalisation.
  • DIY: Ajoutez un code dans votre application qui lirait les propriétés du système et appliquerait les propriétés aux niveaux de journalisation au démarrage.
22
kan

Je sais que c'est une vieille question, mais voici mon code de solution pour initialiser les niveaux de Logback Logger à partir de SysProps, si quelqu'un en a besoin. Notez qu'il récupère le Logback Logger en utilisant LoggerFactory de Slf4j. Il utilise un Java 8 lambda mais pourrait facilement être traduit en Java 7 ou moins).

Il vous suffit d'ajouter SysPropLogbackConfigurator.applyOnce() au début de votre méthode main. S'il est appelé plusieurs fois, l'initialiseur statique empêchera une nouvelle analyse des propriétés.

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() {
        };
    }
}
7
Benoît

Comme indiqué dans la FAQ :

Logback ne permet pas de désactiver la journalisation à partir de la ligne de commande. Cependant, si le fichier de configuration le permet, vous pouvez définir le niveau des enregistreurs sur la ligne de commande via une propriété système Java.

Donc, comme @kan l'a mentionné précédemment, vous devez utiliser d'autres options.

2
Dag