24

我想摆脱这一切...

public void info(String msg);
public void info(String format, Object arg);
public void info(String format, Object arg1, Object arg2);
public void info(String format, Object[] argArray);

...并用这个替换它...

public void info(String format, Object ... args);

...这样我的日志记录语法就不必根据我要记录的参数数量而改变。似乎有很多讨论和工作围绕它,但它在哪里?或者我应该包装 slf4j 的包装器吗?

4

7 回答 7

14

The real question is "Why must a jdk < 5 be supported by this any longer"? If you have an older version of java, then use the older API. It's that simple. Why not make this fit better into the current java world? I mean, JDK 5 isn't even supported without a support contract from Sun/Oracle. Backward compatibility is a joke in this case.

于 2010-06-07T17:16:52.920 回答
11

这终于解决了。SLF4J 1.7.0 现在需要 JDK 1.5 并且具有向后兼容的可变参数方法。

于 2012-09-10T11:07:50.230 回答
7

不。

问题仍然是如何在保持 100% 向后兼容性的同时正确地做到这一点。

请随意查看http://bugzilla.slf4j.org/show_bug.cgi?id=31上的讨论

于 2009-12-23T15:27:29.360 回答
5

那这个呢:

package util;

public class Util {
  public static Object[] va(Object... args) {
    return args;
  }
}

package foo;
import static util.Util.va;
...
 logger.info("a {}, b {}, c c {}", va("A", "B", "C"));
...

你也可以在其他地方使用 va() 。

于 2011-03-19T04:21:16.810 回答
4

通过阅读Logger的 SLF4J javadoc,简单的答案似乎是否定的。根据我的阅读,他们希望与旧版本的 JDK 保持兼容。

如果您并不真正依赖于使用 SLF4J,那么也许log5j是一种选择?

于 2009-12-23T14:35:41.903 回答
1

有一个在 SLF4J 中使用可变参数的解决方案。

有一个名为 Lumberjack 的开源项目扩展了 SLF4J 以提供可变参数日志记录方法。扩展非常自然,与使用 SLF4J 相比,您感觉不到任何区别(这是因为 Lumberjack 只是 SLF4J 的一个包装器,所以所有功能仍然由 SLF4J 提供)。

示例用法:

JackLogger logger = JackLoggerFactory.getLogger(LoggerFactory.getLogger(Weather.class));

logger.info("Hello {}! The current time is {}:{}:{}, and after {} hours the weather will be {}.", "Jack", 13, 30, 0, 5, "sunny");

伐木工人网站:https ://github.com/bogdanu/lumberjack

Lumberjack 许可证与 SLF4J 的许可证相同,即 MIT 许可证,因此没有额外的许可限制。

免责声明:我是伐木工人的作者

于 2012-05-08T06:39:30.063 回答
0

试试jcabi-log工具包,它使用方便的 vararg 接口包装 SLF4J 日志记录。

于 2012-05-14T06:42:26.160 回答