我们正在使用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); }
但是没有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)
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)
log(Level level, Throwable t, String msg, Object... params)
这可能是安全的补充。Oracle进行了一项调查,很显然,他们希望您将lambda或方法引用与采用a Supplier<String>并依赖于提供var- args支持的java.util.Formatter的一种日志方法一起使用。
Supplier<String>
} catch (IllegalArgumentException iae) { logger.log(Level.SEVERE, iae, () -> String.format("%1$s is too many.", count)); }