如何消除 Log 的重复代码?

2022-03-09 23:21:08 +08:00
 golangLover

请教大家一个问题,我现在再用 jackson 的 writeValueAsString 作为 Log.基本上就是一股脑的

如果是 list ,那我就要

for(Item item: list){
	log.info("[函数名] 信息: {}", mapper.writeValueAsString(item));
}

要么是 map 就,没办法这个 jackson 有个 checked exception 。。。必须这样处理。

map.forEach((key,value)->{
	try{
    	log.info("[函数名] 信息: {}", mapper.writeValueAsString(item));
    }catch(JsonProcessingException e){
    	throw new RuntimeException(e);
    }
})

然后我就觉得很烦,也妨碍阅读。但没有 log 是不行的,aop 也不行,因为我不是想出入参 log ,是中间的某些重要变量也要 log ,但不重要的就不 log ,所以只能手动。

我主要就是想请教有没有大佬如何抽象出这个 map 的那个 tryCatch JsonProcessingException 那部分,只保留

log.info("[函数名] 信息: {}", mapper.writeValueAsString(item))

作为一个 consumer 。我试着自己写了,但是 consumer.accept 那里好像说不能处理 JsonProcessingException, 因为 consumer 自己是不抛出这个 exception 的。

意象之中希望是这样的

listFunc(list, ()->log.info("[函数名] list item: {}");)

还有就是

mapFunc(map, ()->log.info("[函数名] map key = {}, value = {}");)

或者大佬有没有好的见解让我看看如何打 log.

你可能觉得为什么不直接整个 list 进去一个 log:

log.info("[函数名], 信息: {}", mapper.writeValueAsString(list)).

一来就是方便阅读。另外就是怕这个 list 或者 map 里面的东西很多,以前试过用 toString 或者 Gson ,然后东西多的时候直接就 stackoverflow. 还有就是处理循环引用方面似乎也方便。

谢谢大家。

1973 次点击
所在节点    Java
5 条回复
wangyu17455
2022-03-09 23:27:17 +08:00
Leviathann
2022-03-10 00:39:55 +08:00
公司的代码库里 JsonUtils 是直接 try return write catch return null..
corningsun
2022-03-10 09:53:21 +08:00
搞个全局静态函数 JsonUtils ,mapper 也提前初始化好。

public static String writeValueAsString(Object obj) {
try{
return mapper.writeValueAsString(item);
} catch(JsonProcessingException e){
throw new RuntimeException(e);
}
}

使用

log.info("[函数名] 信息: {}", JsonUtils.writeValueAsString(item))
golangLover
2022-03-10 10:37:36 +08:00
@wangyu17455 我觉得这个是最适合我的。谢谢了。

也感谢 @Leviathann @corningsun 提供的帮助
nothingistrue
2022-03-10 13:56:38 +08:00
lombok 省事,但是这个是语法糖不是代码模板,用起来有争议。

可以考虑用包装方法把 checked exception 变成 unchecked exception 。例如:
writeValueAsStringNonChecked(ObjectMapper mapper, Object object){
try {
mapper.writeValueAsString(object);
}catch(JsonProcessingException e){
throw new RuntimeException(e);// 用得多了还可以考虑定义一个专用异常
}
}
这个方法放在哪里很自由,看你的工程规范。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/839260

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX