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

大家有没有 Java 异常通知插件分享下

  •  
  •   simonlu9 · 2023-03-08 18:28:32 +08:00 · 1059 次点击
    这是一个创建于 386 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 目前使用 elk 日志记录异常记录,但是使用不太方便,参数不能记录,只能写在异常信息里面,不能单独一个字段存放
    • 单纯的 elk 查找,要定位还要去 nginx 查看参数信息,如果去 java 的日志文件,定位时间点,然后查看 sql 日志,才能定位错误,如果当天的日志过大,还要切分日志
    • 最好能够制定异常类才通知,带上负责人,才能快速定位,现在信息都打印到钉钉里面,看起来杂乱无章,自己造轮子又没时间
    • 有没有满足上面条件的推荐一些
    第 1 条附言  ·  341 天前

    经过自己研究,可以找到如下解决方案

    • 利用MDC 日志传递属性,MDC是线程安全的,但是在线程池的时候要执行完成时候注意clean属性
    • 自定义layout 扩展日志格式传递到elk里面进行分析
    • 定义append只传递error等级日志
    • 新建filter 向MDC 设置环境信息
    • 全局绑定唯一traceId 上面的话基本可以解决web访问的跟踪,可以从错误日志里面看到相关的设备,用户信息,传递参数 但非web访问的错误记录怎样记录呢,比如async,schedule 这些执行出现错误怎么跟踪

    继承 ThreadPoolTaskScheduler,重写schedule方法,生成唯一traceID

    public ScheduledFuture<?> schedule(Runnable task, Trigger trigger) {
    
        return super.schedule(ThreadMdcUtil.wrap(task,MDC.getCopyOfContextMap()), trigger);
    }
    

    怎样报警呢

    • 策略1,如果再短时间发现多个用户(根据用户设备id判断-因为有可能用户未登录)发生同一个错误,马上告警
    • 策略2 ,如果短时间发现同一个错误出现多次,马上告警
    • 可以通过定义不用的异常类,那些要处理的,那些不用处理的,这样程序容易过滤,开发者只关心那些不能处理的异常

    找到traceId,怎样快速再打日志文件查找上下文信息呢

    • 后台可以可以每小时分割日志,这样通过时间点去找到日志再grep traceId就可以找到所有traceId的所有等级的日志,比如sql的查询语句
    3 条回复    2023-03-08 18:52:02 +08:00
    zhenjiachen
        1
    zhenjiachen  
       2023-03-08 18:47:05 +08:00 via iPhone   ❤️ 1
    sentry
    LykorisR
        2
    LykorisR  
       2023-03-08 18:47:36 +08:00   ❤️ 1
    可以自建个 Sentry ,我现在给学校做的项目 spring 加的 sentry 还可以,但也不是很完美
    zhaorunze
        3
    zhaorunze  
       2023-03-08 18:52:02 +08:00
    我们就是 cat + elk + 钉钉通知
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5141 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:34 · PVG 17:34 · LAX 02:34 · JFK 05:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.