java - java.util.logging java 8 中的可变参数

标签 java java.util.logging

我们正在使用 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/

上一篇:java - 汉诺塔输出

下一篇:Java 命名查询

相关文章:

java - 带有惰性求值的 String.format

java - 在 org.w3c.dom.Document 中搜索属性的最快方法

java - 为 Android 应用程序编写伪代码

java - 使用log4j生成多个日志文件

java - 无法理解动态规划

java - 手动在谷歌地图上拖放图钉并在谷歌地图 APIV2 中获取经度和纬度

java - 是否可以在不停止 Tomcat 的情况下更改logging.properties文件

java - 是否可以让 Handler 认识到它已被删除?

java - Commons 日志记录以使用 java.util.logging

java - 如何配置 Hibernate 以使用标准日志记录