使用slf4j Logger记录所有HashMap的键和值

5
我该如何使用slf4j日志记录HashMap的key和value。我已经尝试了几次,但仍然不知道如何实现。
以下代码只记录“test values”字符串,而没有记录map参数的值。
  public void test(HashMap maps) {
      logger.info("test values", maps);
  }
4个回答

15

您的代码使用的是这个重载方法(请参阅javadoc):

void info(String message, Object p0)

记录带参数的信息,级别为info。

该重载方法将p0的字符串表示替换到message模板字符串中的第一个占位符位置。但是您的消息中没有任何占位符!

以下是一种快速解决方法:

  public void test(HashMap maps) {
      logger.info("test values {}", maps);
  }

相关问题:


2
假设您尝试这样在HashMap中进行迭代。
public void printMap(Map mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        logger.info(pair.getKey() + " = " + pair.getValue());
    }
}

这个文章中有更多的例子和方法。


2
我只想记录所有键和值一次,而不是每个键值对都记录一次日志。 - My Intek

0
打印地图在记录中有很多种方式。以下是一些分享的方法:
使用记录器在日志中打印地图:
Map yourMap = // 在这里插入你的地图 logger.info("打印地图:" + yourMap.toString());
这段代码将把地图作为字符串打印在日志输出中。你可以使用地图的toString()方法将其转换为字符串表示形式。请注意,如果你有复杂的地图,这种方法可能不是最易读或最有用的。
遍历地图并逐个记录其键值对:
Map yourMap = // 在这里插入你的地图
for (Map.Entry entry : yourMap.entrySet()) { logger.info("键:" + entry.getKey() + ",值:" + entry.getValue()); }
这将在单独的日志条目中记录每个键值对。
使用像Apache Commons Lang或第三方JSON库这样的库来获得更结构化和易读的输出。这里是使用Apache Commons Lang的一个示例。
Map yourMap = // 在这里插入你的地图
// 使用Apache Commons Lang以更易读的格式打印地图
String mapString = ToStringBuilder.reflectionToString(yourMap, ToStringStyle.JSON_STYLE); logger.info("地图:" + mapString);
另一个示例,使用Jackson进行JSON序列化。
// 使用Jackson将地图打印为JSON try { ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(yourMap); logger.info("JSON地图:" + json); } catch (IOException e) { e.printStackTrace(); }

0
如果你想要将每个键值对分别打印在一行上,或者使用更自定义的格式,你可以遍历地访问地图的条目:
public void test(HashMap<?, ?> maps) {
    for (Map.Entry<?, ?> entry : maps.entrySet()) {
        logger.info("Key: {}, Value: {}", entry.getKey(), entry.getValue());
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接