是否可以在命令行上配置日志返回记录器级别?
Log4J允许您从命令行传递您希望应用程序中的特定记录器登录的级别,例如“-Dlog4j.logger.com.whatever.MyClass=DEBUG”。我在Logback中找不到任何类似的设施。根据FAQ,它似乎允许您做的就是使用变量替换来设置根记录器的级别。是我错过了什么,还是Logback不支持这个?谢谢。
Log4J允许您从命令行传递您希望应用程序中的特定记录器登录的级别,例如“-Dlog4j.logger.com.whatever.MyClass=DEBUG”。我在Logback中找不到任何类似的设施。根据FAQ,它似乎允许您做的就是使用变量替换来设置根记录器的级别。是我错过了什么,还是Logback不支持这个?谢谢。
是的,似乎没有这样的功能。据我所知,部分原因是对数回配置更复杂,因此很难通过扁平字符串属性实现合理的配置灵活性。部分原因是,恕我直言,它鼓励了不良做法 - 放置太多系统属性 - 导致运行脚本或命令行臃肿,比单独的日志记录配置文件更难管理。
但是,我可以建议几个选项:
${sys.prop.var.name}
-Dlogback.configurationFile=/path/to/customised/logback.xml
我知道这是一个老问题,但这是我的解决方案代码,用于从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() {
};
}
}