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