java.util.logging java 8中的Varargs
我们正在使用java.util.loggingjava.util.logging java 8中的Varargs,java,java.util.logging,Java,Java.util.logging,我们正在使用java.util.logging void log(Level level, Throwable thrown, Supplier<String> msgSupplier) 但是没有varargs方法。怎么会?这看起来像是未来的增强功能,还是有什么好的理由不使用以下功能: public void log( Level level, Throwable t, String msg, Object... params) { // throw ne
void log(Level level, Throwable thrown, Supplier<String> msgSupplier)
但是没有varargs方法。怎么会?这看起来像是未来的增强功能,还是有什么好的理由不使用以下功能:
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而不是log,但doLog是一个私人助手!不知道为什么,因为我没有办法设置包等-希望它是
公共无效doLog(日志记录lr)而非私有
不管怎样,对于我们来说,下面的方法可以做同样的事情,这样我们就可以使用我们自己的varargs方法了
// 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);
}
但是没有varargs方法。怎么会?这看起来像是一个未来的增强
多年来,OpenJDK站点上有多个请求。API并不是很好。JDK 8中更新了日志记录,但没有更新日志记录指南中的最佳实践,只是中的几个示例
我创建了helperpublicstaticvoidlog(Logger、Level、Throwable t、stringmsg、Object…params)
您可能希望在中使用该版本,因为它将保留正确的类和方法名称,因为调用方仍负责发布日志记录
有什么好的理由不使用类似于log(Level-Level,Throwable t,String-msg,Object…params)的东西吗?
这可能是安全的。很明显,他们希望您将lambda或方法引用与一种日志方法结合使用,该日志方法采用供应商
,并依赖于为var args提供支持
} catch (IllegalArgumentException iae) {
logger.log(Level.SEVERE, iae, () -> String.format("%1$s is too many.", count));
}
甜甜的lambda语法胜过蔬菜 这是基于意见的<代码>java.util.logging是在Java1.4中引入的。为什么它没有充分利用后来Java版本的所有特性?除了软件包作者之外,没有人知道。可能是因为他们有更好的事情要做。Sun和Oracle认为没有必要进行更新。您可能想考虑使用SLF4J来抽象实现并获得VARARGS。SLF4J是当今的行业标准。它有一个更好的API,并且与JUL完全兼容。在一个有很多TXN和db ops的系统中,它不仅仅基于观点,除非日志级别需要,否则不创建线程,这是一个巨大的节约。拥有更少的匿名方法在堆上也不那么过分。可以为此测试内存。是的,我在日志级别打开和关闭时测试了日志,给出的函数性能较差。但愿我们有瓦拉格。我们计划很快将其转移到log4j2api,无论如何后端是log4j2。此外,供应商版本在构建日志记录之前在日志线程上进行任何格式化,而参数版本只是将消息和参数转储到日志记录中,因此处理程序可以在另一个线程(或)上进行格式化。
} catch (IllegalArgumentException iae) {
logger.log(Level.SEVERE, iae, () -> String.format("%1$s is too many.", count));
}