Подтвердить что ты не робот

Можно ли настроить уровни loglog logger в командной строке?

Log4J позволяет вам передать уровень, в котором вы хотите, чтобы определенные регистраторы в вашем приложении регистрировались в командной строке, например. "-Dlog4j.logger.com.whatever.Myclass= DEBUG". Я не могу найти подобное средство в журнале. Согласно часто задаваемому вопросу, все, что вам кажется, позволяет установить уровень для корневого регистратора, используя переменную подстановку. Есть ли что-то, что мне не хватает или Logback просто не поддерживает это? Спасибо.

4b9b3361

Ответ 1

Да, кажется, что такой функции нет. Насколько я понимаю, отчасти это связано с тем, что конфигурация журнала более сложна, поэтому довольно сложно достичь разумной гибкости конфигурации с помощью плоских свойств строки. Партия, потому что, imho, она поощряет плохую практику - размещение слишком много свойств системы - приводит к раздутым сценариям запуска или командам, более сложным для управления, чем отдельным файлам конфигурации ведения журнала.

Однако я мог бы предложить несколько вариантов:

  • используйте ${sys.prop.var.name} подстановки в файле конфигурации logback.xml.
  • скопируйте logback.xml локально, измените требуемые уровни регистрации и укажите -Dlogback.configurationFile=/path/to/customised/logback.xml. Имейте в виду, что "Logback-classic может сканировать изменения в файле конфигурации и автоматически перенастраиваться при изменении файла конфигурации". Таким образом, вам даже не нужно перезапускать процесс для изменения уровней ведения журнала.
  • Сделай сам: добавьте в приложение код, который будет читать свойства системы и применять свойства к уровням ведения журнала во время запуска.

Ответ 2

Я знаю, что это старый вопрос, но вот мой код решения для инициализации уровней Logback Logger из SysProps, если кому-то это нужно. Обратите внимание, что он извлекает Loglog Logger с помощью Slf4j LoggerFactory. Он использует Java 8 лямбда, но может быть легко переведен на Java 7 или менее.

Вам просто нужно добавить SysPropLogbackConfigurator.applyOnce() в начале вашего метода main. Если вызвано многократное время, статический инициализатор предотвратит повторное сканирование свойств.

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

Ответ 3

Как указано в FAQ:

Резервное копирование не позволяет отключить ведение журнала из командной строки. Однако, если это позволяет файл конфигурации, вы можете установить уровень регистраторов в командной строке с помощью системного свойства Java.

Так как @kan упоминается ранее, вам нужно использовать другие параметры.