如何消除 Log 的重复代码? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
golangLover
V2EX    Java

如何消除 Log 的重复代码?

  •  
  •   golangLover Mar 9, 2022 2415 views
    This topic created in 1509 days ago, the information mentioned may be changed or developed.

    请教大家一个问题,我现在再用 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 replies    2022-03-10 13:56:38 +08:00
    Leviathann
        2
    Leviathann  
       Mar 10, 2022
    公司的代码库里 JsonUtils 是直接 try return write catch return null..
    corningsun
        3
    corningsun  
       Mar 10, 2022
    搞个全局静态函数 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
       Mar 10, 2022
    @wangyu17455 我觉得这个是最适合我的。谢谢了。

    也感谢 @Leviathann @corningsun 提供的帮助
    nothingistrue
        5
    nothingistrue  
       Mar 10, 2022
    lombok 省事,但是这个是语法糖不是代码模板,用起来有争议。

    可以考虑用包装方法把 checked exception 变成 unchecked exception 。例如:
    writeValueAsStringNonChecked(ObjectMapper mapper, Object object){
    try {
    mapper.writeValueAsString(object);
    }catch(JsonProcessingException e){
    throw new RuntimeException(e);// 用得多了还可以考虑定义一个专用异常
    }
    }
    这个方法放在哪里很自由,看你的工程规范。
    About     Help     Advertise     Blog     API     FAQ     Solana     6078 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 02:28 PVG 10:28 LAX 19:28 JFK 22:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86