java - 是否有任何 apache utils 打印数组一些可理解的字符串

标签 java logging apache-commons-beanutils

我正在我的代码中使用 org.slf4j.Logger 进行一些日志记录。有些地方它来了,我想看看数组的内容,主要是字符串数组,对象类型数组。如果对象类型主要使用 toString() 实现。
是否有任何 apache utils 或其他东西可以将数组转换为可理解的字符串?

最佳答案

正如其他答案中所建议的,您可以使用 Arrays.toString() 为数组构造“有意义的”字符串表示。当然,前提是你使用的是JDK 5+

更“正确”的结果应该是使用 Arrays.deepToString(),为此如果它是数组中包含的其他数组实例,则包含的数组也会正确转换为字符串。

如果您没有使用 JDK5+,在 Apache Commons Lang 中,您可以使用 ArrayUtils.toString()

鉴于您提到了 SLF4J Logger,有一些值得研究的地方。

当我们使用 SLF4J Logger 时,我们总是会做类似的事情

logger.info("data is {}", data);

这样做而不是 logger.info("data is "+ data); 的原因是因为日志消息可以延迟评估,只有当记录器实际上启用了 INFO 级别时。当构建消息的成本很高时,它特别有用。

然而,简单地使用 Arrays.deepToString() 将带走这个优势:

logger.info("data is {}", Arrays.deepToString(dataArray));

无论记录器是否启用 INFO 级别,都会发生昂贵的 dataArray 到字符串转换。

为了解决它,您可以在记录之前明确检查记录器级别:

if (logger.isInfoEnabled()) {
    logger.info("data is {}", Arrays.deepToString(arrayData));
}

您也可以考虑制作这样的助手(伪代码):

public class ArrayToStringHelper {
    Object[] arrayData;
    public ArrayToStringHelper(Object[] arrayData) {
        this.arrayData = arrayData;
    }
    @Override
    public String toString() {
        return Arrays.deepToString(arrayData);
    }
}

这样数组到字符串的转换会延迟到实际需要时:

logger.info("data is {}", new ArrayToStringHelper(arrayData));

关于java - 是否有任何 apache utils 打印数组一些可理解的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15780896/

相关文章:

c# - 如何追踪 AppInsights 内部错误

java - BeanUtils.setProperty 不适用于 boolean 值?

java - 如何在selenium中找到具有相同名称和相同属性的元素并插入一些文本

java - Node.js 和 Jetty 6

java - 在 Java 中比较两组的最快方法是什么?

asp.net-mvc-3 - 将 Microsoft.VisualBasic.Logging.FileLogTraceListener 与 ASP.NET MVC 3 结合使用

java - 找出图的最大长度

c# - 为 nlog : Error when setting property 'Layout' on NLog. Targets.DatabaseParameterInfo 创建配置节处理程序时出错

java - 如何使用 BeanUtils 自省(introspection)获取 Java 对象的所有属性列表?