是否可以在命令行上配置logback logger级别?

bfa*_*her 30 java logging log4j logback

Log4J允许您传递应用程序中特定记录器的级别,以便从命令行进行登录,例如"-Dlog4j.logger.com.whatever.MyClass = DEBUG".我在Logback中找不到任何类似的工具.根据FAQ,所有它似乎允许你做的是通过使用变量替换设置根记录器的级别.有什么我缺少或Logback不支持这个吗?谢谢.

kan*_*kan 23

是的,似乎没有这样的功能.据我了解,部分原因是因为后备配置更复杂,所以很难通过扁平字符串属性实现合理的配置灵活性.部分是因为,imho,它鼓励不良做法 - 放置太多系统属性 - 导致膨胀的运行脚本或命令行,比单独的日志记录配置文件更难管理.

但是,我可以提出几种选择:

  • ${sys.prop.var.name}在logback.xml配置文件中使用替换
  • 在本地复制logback.xml,使用所需的记录器级别对其进行修改并指定-Dlogback.configurationFile=/path/to/customised/logback.xml.请记住,"Logback-classic可以扫描其配置文件中的更改,并在配置文件更改时自动重新配置".因此,您甚至不需要重新启动流程来更改日志记录级别.
  • DIY:在应用程序中添加一个代码,该代码将读取系统属性并在启动期间将属性应用于日志记录级别.


Ben*_*oît 8

我知道这是一个老问题,但这是我的解决方案代码,用于从SysProps初始化Logback Logger级别,如果有人需要它.请注意,它使用Slf4j的LoggerFactory检索Logback Logger.它使用Java 8 lambda但可以很容易地转换为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() {
        };
    }
}
Run Code Online (Sandbox Code Playgroud)


Dag*_*Dag 5

正如常见问题解答中所述:

Logback 不允许从命令行禁用日志记录。但是,如果配置文件允许,您可以通过 Java 系统属性在命令行上设置记录器的级别。

因此,正如 @kan 之前提到的,你必须使用其他选项。