小编典典

java.util.logging Java 8中的变量

java

我们正在使用java.util.logging

void log(Level level, Throwable thrown, Supplier<String> msgSupplier)

以及其他一些便捷方法,例如

logp(Level level, String sourceClass, String sourceMethod,
                                                String msg, Object params[])

但是没有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而不是在最后一行登录,但是doLog是一个私人帮手!不知道为什么,因为我没有办法设置捆绑包等-希望它是

public void doLog(LogRecord lr)而不是private。

无论如何,对于我们来说,以下方法可以做同样的事情,以便我们可以使用自己的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);
}

阅读 346

收藏
2020-11-26

共1个答案

小编典典

但是没有varargs方法。怎么会?这看起来像是未来的增强功能吗?

多年来,OpenJDK网站上的java.util.logging.Logger中有多次使用Use
argargs的
请求。JDK
5之后
并没有真正维护该API
。日志记录已在JDK
8中针对Lambda表达式进行了更新,但日志记录指南并未针对最佳实践进行更新,只是java.util.logging.Logger中的几个示例。

我创建了助手 public static void log(Logger logger, Level level, Throwable t, String msg, Object... params)

您可能要使用如何使用抛出的参数记录日志中的版本[?](http://codingdict.com/questions/159495因为它将保留正确的类和方法名称,因为调用者仍然负责发布日志记录。

有什么充分的理由不要有这样的东西吗 log(Level level, Throwable t, String msg, Object... params)

这可能是安全的补充。Oracle进行了一项调查,很显然,他们希望您将lambda或方法引用与采用a
Supplier<String>并依赖于提供var-
args支持的java.util.Formatter的一种日志方法一起使用。

} catch (IllegalArgumentException iae) {
    logger.log(Level.SEVERE, iae, () -> String.format("%1$s is too many.", count)); 
}
2020-11-26