java.util.logging java 8中的Varargs

java.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

我们正在使用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 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中更新了日志记录,但没有更新日志记录指南中的最佳实践,只是中的几个示例

我创建了helper
publicstaticvoidlog(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)); 
}