【问题标题】:Formatting floating point numbers in SLF4J在 SLF4J 中格式化浮点数
【发布时间】:2014-05-08 09:20:19
【问题描述】:

我想用 SLF4J 格式化我的双精度和浮点数。

基本上,我在 SLF4J 中寻找相当于 Java 的 String.format("%.2f", floatValue)

阅读了 SLF4J 的文档并四处搜索后,我找不到它是否具有该功能的提示。

我正在使用slf4j-api:1.7.6slf4j-jdk14:1.7.6

非常感谢任何帮助。

【问题讨论】:

  • 这确实是一种解决方法,而不是答案,所以我将其添加为评论:您可以将String.format 的输出作为记录器调用中的参数传递:@987654325 @
  • 这违背了 SLF4Js 参数化日志记录的目的,即避免在未发出日志消息的情况下进行评估。
  • 在这种情况下,最好将调用封装在 if (logger.isDebugEnabled()) logger.debug(... calls to String.format ....); 中以避免整个混乱。
  • @ToddFreed 你会避免消息的字符串连接,这会减少一些开销。

标签: java logging slf4j


【解决方案1】:

导致创建临时对象的有点丑陋的解决方案可能是这样的

public class DelayedFormatter {
    public static Object format(String format, Object... args) {
        return new Object() {
            @Override
            public String toString() {
                return String.format(format, args);
            }
        };
    }
}

然后

import static DelayedFormatter.format;
...
logger.debug("v = {}", format("%.03f", v));

【讨论】:

  • 优雅的方法
  • 大多数情况下,您将记录原始值,并且无论如何都会导致创建临时(包装器)对象...应避免使用 OTOH String#Format()。
  • 如果您为诸如 format(String format, double arg){...toString(){ return String .format(格式,arg); }
【解决方案2】:

我假设您指的是 SLF4J 的扩展参数约定,例如:

float f;
...
logger.debug("My number is {}", f);

所以,答案是否定的。从 SLF4J 1.7.7 开始,您要求做的事情是不可能的,因为 SLF4J 的扩展算法不允许自定义渲染器(例如通过 Log4J 提供的渲染器)。

不过,似乎值得提出功能要求。

编辑

嗯,出于性能考虑,“仅支持”{},当前的格式化实现优于 String.format() 10 倍。 http://www.slf4j.org/faq.html#logging_performance 所以不太可能改变

(source)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多