java.util.logging Java 8中的变量

问题描述

但是没有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或方法引用与采用aSupplier<String>并依赖于提供var- args支持java.util.Formatter的一种日志方法一起使用。

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

解决方法

我们正在使用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,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,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);
}

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”