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

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

  •  
  •   siyemao · 2022-01-05 15:22:35 +08:00 · 2832 次点击
    这是一个创建于 1038 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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