Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以在命令行上配置日志记录器级别?_Java_Logging_Log4j_Logback - Fatal编程技术网

Java 是否可以在命令行上配置日志记录器级别?

Java 是否可以在命令行上配置日志记录器级别?,java,logging,log4j,logback,Java,Logging,Log4j,Logback,Log4J允许您通过命令行传递希望应用程序中特定记录器登录的级别,例如“-Dlog4j.logger.com.whatever.MyClass=DEBUG”。我在Logback中找不到任何类似的设施。根据FAQ,它似乎只允许您通过使用变量替换来设置根记录器的级别。是我遗漏了什么还是Logback不支持这一点?谢谢。是的,似乎没有这样的功能。据我所知,这部分是因为logback配置更复杂,所以很难通过扁平字符串属性实现合理的配置灵活性。 部分原因是,imho,它鼓励了错误的做法-放置太多的系统属性

Log4J允许您通过命令行传递希望应用程序中特定记录器登录的级别,例如“-Dlog4j.logger.com.whatever.MyClass=DEBUG”。我在Logback中找不到任何类似的设施。根据FAQ,它似乎只允许您通过使用变量替换来设置根记录器的级别。是我遗漏了什么还是Logback不支持这一点?谢谢。

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

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

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

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


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

我知道这是一个老问题,但如果有人需要,下面是我的解决方案代码,用于从SysProps初始化回显日志记录器级别。注意,它使用Slf4j的LoggerFactory检索Logback记录器。它使用Java8Lambda,但可以轻松地转换为Java7或更低版本

只需在
main
方法的开头添加
SysPropLogbackConfigurator.applyOnce()
。如果多次调用,静态初始值设定项将阻止重新扫描属性

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

我刚刚在一个单独的答案中为DIY添加了代码()6年后:)-同时有什么变化吗?请使用
logging.config
而不是
logback.configurationFile