log4j 是否可以在命令行上配置回登录日志程序级别?

zfycwa2u  于 2022-11-06  发布在  其他
关注(0)|答案(4)|浏览(143)

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

xzv2uavs

xzv2uavs1#

是的,似乎没有这样的功能。据我所知,部分原因是因为回登录配置更复杂,所以很难通过简单的字符串属性实现合理的配置灵活性。部分原因是,恕我直言,它鼓励了不良实践-放置太多的系统属性-导致臃肿的运行脚本或命令行,比单独的日志配置文件更难管理。
不过,我可以提出几个选择:

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

zu0ti5jz2#

我知道这是一个老问题,但如果有人需要的话,这里是我的解决方案代码,用于从SysProps初始化Logback Logger级别。注意,它使用Slf4j的LoggerFactory检索Logback Logger。它使用Java 8 lambda,但可以很容易地转换为Java 7或更低版本。
您只需要在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() {
        };
    }
}
col17t5w

col17t5w3#

如常见问题解答中所述:
回退不允许从命令行禁用事件记录。但是,如果配置文件允许,则可以通过Java系统属性在命令行上设置事件记录程序的级别。
因此,正如前面提到的,你必须使用其他选项。

bq3bfh9z

bq3bfh9z4#

如果您使用logback和Spring,则可以使用logging.level.xxxx系统属性在命令行上覆盖日志级别。
有关示例,请参见https://stackoverflow.com/a/71403675/3059685

相关问题