【发布时间】:2014-04-23 19:50:06
【问题描述】:
Log4J 允许您传递您希望应用程序中特定记录器从命令行登录的级别,例如“-Dlog4j.logger.com.whatever.MyClass=DEBUG”。我在 Logback 中找不到任何类似的工具。根据常见问题解答,它似乎允许您做的只是使用变量替换设置根记录器的级别。有什么我遗漏的东西还是 Logback 不支持这个?谢谢。
【问题讨论】:
标签: java logging log4j logback
Log4J 允许您传递您希望应用程序中特定记录器从命令行登录的级别,例如“-Dlog4j.logger.com.whatever.MyClass=DEBUG”。我在 Logback 中找不到任何类似的工具。根据常见问题解答,它似乎允许您做的只是使用变量替换设置根记录器的级别。有什么我遗漏的东西还是 Logback 不支持这个?谢谢。
【问题讨论】:
标签: java logging log4j logback
如果您使用的是 logback 和 Spring,那么您可以使用 logging.level.xxxx 系统属性在命令行上覆盖日志记录级别。
【讨论】:
我知道这是一个老问题,但如果有人需要,这是我从 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() {
};
}
}
【讨论】:
是的,好像没有这个功能。据我了解,部分原因是 logback 配置更复杂,因此很难通过扁平字符串属性实现合理的配置灵活性。 部分原因是,恕我直言,它鼓励不良做法——放置过多的系统属性——导致运行脚本或命令行臃肿,比单独的日志配置文件更难管理。
不过,我可以提出几个选择:
${sys.prop.var.name} 替换-Dlogback.configurationFile=/path/to/customised/logback.xml。请记住,“Logback-classic 可以扫描其配置文件中的更改,并在配置文件更改时自动重新配置”。因此,您甚至无需重新启动进程即可更改日志记录级别。【讨论】:
logging.config 而不是logback.configurationFile
logging.config。在这种情况下,您可以使用 classpath: 协议引用您的 .xml 文件:-Dlogging.config=classpath:my-custom-logback.xml
【讨论】: