我们正在使用 java.util.logging
void log(Level level, Throwable thrown, Supplier<String> msgSupplier)
还有一些更方便的方法,例如
logp(Level level, String sourceClass, String sourceMethod,
String msg, Object params[])
但是没有可变参数方法。怎么会?这看起来像是 future 的增强功能还是有任何充分的理由不采用类似的东西:
public void log( Level level, Throwable t, String msg, Object... params) {
// throw new RuntimeException("No yet impl");
if (!isLoggable(level)) {
return;
}
LogRecord lr = new LogRecord(level, msg);
lr.setParameters(params);
if (t != null) {
lr.setThrown(t);
}
doLog(lr);
}
我创建了助手:
public static void log(Logger logger, Level level, Throwable t, String msg, Object... params) {
// throw new RuntimeException("No yet impl");
if (!logger.isLoggable(level)) {
return;
}
LogRecord lr = new LogRecord(level, msg);
lr.setParameters(params);
if (t != null) {
lr.setThrown(t);
}
logger.log(lr);
}
很想调用 doLog 而不是在最后一行登录,但 doLog 是一个私有(private)助手!不知道为什么,因为我无法设置 bundle 等 - 希望它是
public void doLog(LogRecord lr) 而不是 private。
无论如何,对于我们来说,下面的方法可以做同样的事情,这样我们就可以使用我们自己的可变参数方法?
// resource bundle and then call "void log(LogRecord)".
private void doLog(LogRecord lr) {
lr.setLoggerName(name);
final LoggerBundle lb = getEffectiveLoggerBundle();
final ResourceBundle bundle = lb.userBundle;
final String ebname = lb.resourceBundleName;
if (ebname != null && bundle != null) {
lr.setResourceBundleName(ebname);
lr.setResourceBundle(bundle);
}
log(lr);
}
最佳答案
But no varargs method. How come? Does this seem like a future enhancement...
有多个对 Use varargs in java.util.logging.Logger 的请求多年来一直在 OpenJDK 网站上。该 API 并不是真正的 maintained after JDK 5 。 JDK 8 中的日志记录已更新为 Lambda Expressions但日志记录指南并未针对最佳实践进行更新,只是 java.util.logging.Logger 中的几个示例.
I created helper
public static void log(Logger logger, Level level, Throwable t, String msg, Object... params)
您可能想使用 How can I log with params with a thrown? 中的版本因为调用者仍然负责发布日志记录,因此它将保留正确的类和方法名称。
is there any good reason not to have something like
log(Level level, Throwable t, String msg, Object... params)
这可能是安全的添加。 Oracle ran a survey很明显,他们更希望您将 lambda 或方法引用与采用 Supplier<String>
的 log 方法之一一起使用。并依靠java.util.Formatter提供对 var-args 的支持。
} catch (IllegalArgumentException iae) {
logger.log(Level.SEVERE, iae, () -> String.format("%1$s is too many.", count));
}
甜甜的 lambda 语法胜过蔬菜!
关于java - java.util.logging java 8 中的可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44185698/