[ Java ]怎么实现在 catch 前后打印日志? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
siyemao
V2EX    Java

[ Java ]怎么实现在 catch 前后打印日志?

  •  
  •   siyemao Jan 5, 2022 3461 views
    This topic created in 1575 days ago, the information mentioned may be changed or developed.

    领导有一个需求,为了方便定位问题,要在所有项目中的 catch 前后都统一打印日志。

    我最开始想要用 AOP 实现,后面发现异常已经被 catch 吃掉了,aop 根本拿不到。

    思想来去好像也没有其他的办法了,各位大佬有什么思路吗?

    19 replies    2022-01-06 18:11:33 +08:00
    shanghai1943
        1
    shanghai1943  
       Jan 5, 2022
    那就把代码拆成 aop 可以切到的地方
    Kasumi20
        2
    Kasumi20  
       Jan 5, 2022
    对代码进行预处理过后再编译?参考 C 语言预处理器 cpp
    tedzhou1221
        3
    tedzhou1221  
       Jan 5, 2022
    把提出问题的人解决了
    wolfie
        4
    wolfie  
       Jan 5, 2022
    catch 后 log.error 都懒得打,项目管理的锅。
    boozer
        5
    boozer  
       Jan 5, 2022
    什么叫 catch 前后? catch 的 exception 里面不是已经有堆栈信息了吗
    kokutou
        6
    kokutou  
       Jan 5, 2022 via Android
    catch 后在里面打就行了

    catch 前。。。那就是前面的一些代码也打日志,打印一些 exception 相关的其他信息吧,当时的变量什么的
    siyemao
        7
    siyemao  
    OP
       Jan 5, 2022
    这个实际上是我同事的问题,我也觉得很奇怪,明明手动 log 就可以了,非要想办法统一打。听他说,领导让他想办法改源码,在生成异常的时候处理,我就觉得特么不靠谱。
    james2013
        8
    james2013  
       Jan 5, 2022
    项目上用的是在 controller 里每个接口上,try catch,在 catch 里把请求的 bean(手动去掉密码等过敏信息)和错误日志一起保存
    因为本地去复现该问题有时比较难,这样直接拿到请求数据就比较方便
    bk201
        9
    bk201  
       Jan 5, 2022
    你要把 catch 封装掉吗
    tonyli
        10
    tonyli  
       Jan 5, 2022
    全局查找替换
    potatowish
        11
    potatowish  
       Jan 5, 2022 via iPhone
    catch 前是什么鬼,代码执行到哪里都是未知的,用 aop 切到方法调用前就行了,catch 之后,可以抛出自定义异常,在自定义异常里面打印
    BlueMeow
        12
    BlueMeow  
       Jan 5, 2022
    用 AspectJ 等工具注入一下?
    kingfalse
        13
    kingfalse  
       Jan 5, 2022 via Android
    javassist 解君愁
    az467
        14
    az467  
       Jan 5, 2022
    编译器插件
    xuanbg
        15
    xuanbg  
       Jan 5, 2022
    统一捕获异常进行处理不就能把 catch 后的日志打出来了?至于前么,那要看怎么个前法,反正我都是一杆子给前到头,就是用拦截器打印请求参数。
    KentY
        16
    KentY  
       Jan 5, 2022
    “catch 前” 我不甚理解含义, 那不就是程序正常执行的时候嘛?
    你可以开发一个你们公司通用的 ExceptionHandler , 然后所有项目都用它来处理 exception 就好了, 至于具体是打印还是保存到什么地方, 自己可以实现。
    还有一个,倘若最终目的是集中错误信息, 可以用 kibana 呀
    cais
        17
    cais  
       Jan 6, 2022
    我是不是可以这么理解, 领导无非就是想把 进程序把传入参数打印出来,执行成功成功日志打印,如果中途错误需要把错误日志打印出来就可以了
    如果是我说的这种情况,首先使用 aop 实现 请求名,请求地址,请求参数,耗时等这些信息都可以统一打印出来,另外错误信息的话就需要自定义异常和全局异常捕获(不懂可以百度,google)组合使用,在全局异常具体方法里输出你想要的错误信息。
    不知道会不会对你有帮助
    siweipancc
        18
    siweipancc  
       Jan 6, 2022 via iPhone
    换掉同路径的 exception class, 调用方到堆栈找
    Chinsung
        19
    Chinsung  
       Jan 6, 2022
    你这个,一般的字节码框架都不一定有 api 去方便的支持吧。
    不过可以去找下,bytebuddy 有没有方便的 api 。
    实在不行,jst 肯定能解决。
    About     Help     Advertise     Blog     API     FAQ     Solana     3415 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 84ms UTC 10:55 PVG 18:55 LAX 03:55 JFK 06:55
    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