V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
golangLover
V2EX  ›  Java

如何消除 Log 的重复代码?

  •  
  •   golangLover · 2022-03-09 23:21:08 +08:00 · 1974 次点击
    这是一个创建于 997 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教大家一个问题,我现在再用 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. 还有就是处理循环引用方面似乎也方便。

    谢谢大家。

    5 条回复    2022-03-10 13:56:38 +08:00
    Leviathann
        2
    Leviathann  
       2022-03-10 00:39:55 +08:00
    公司的代码库里 JsonUtils 是直接 try return write catch return null..
    corningsun
        3
    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
        4
    golangLover  
    OP
       2022-03-10 10:37:36 +08:00
    @wangyu17455 我觉得这个是最适合我的。谢谢了。

    也感谢 @Leviathann @corningsun 提供的帮助
    nothingistrue
        5
    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);// 用得多了还可以考虑定义一个专用异常
    }
    }
    这个方法放在哪里很自由,看你的工程规范。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   967 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:15 · PVG 04:15 · LAX 12:15 · JFK 15:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.