java异常未上报sentry需检查uncaughtexceptionhandler是否被覆盖;elk堆栈丢失因logback未配%ex{full}及filebeat multiline配置错误;spring boot 3需升级sentry-spring-boot-starter至7.0+并处理jakarta迁移;elk中应提取exception_type为keyword类型以加速检索。

Java应用里异常没上报到Sentry?先检查UncaughtExceptionHandler是否被覆盖
很多项目在Spring Boot里加了Sentry.init(),但线上还是收不到NullPointerException这类未捕获异常。根本原因是JVM的全局异常处理器被其他框架(比如某些RPC SDK、自定义线程池)悄悄替换了,Sentry默认注册的Thread.setDefaultUncaughtExceptionHandler失效了。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 启动时主动检查:打印
Thread.getDefaultUncaughtExceptionHandler(),确认它是不是io.sentry.SentryClient或io.sentry.android.Android Sentry相关实例 - 如果被覆盖,在
Sentry.init()之后立刻重新设置:Thread.setDefaultUncaughtExceptionHandler(Sentry.getStoredClient().getUncaughtExceptionHandler()) - 对自定义
ThreadPoolExecutor,别只设setThreadFactory,必须显式调用setUncaughtExceptionHandler传入Sentry的处理器
ELK栈里Java异常日志堆栈丢失?关键在logback-spring.xml的%ex配置
Logstash收到的日志只有第一行java.lang.RuntimeException,后面几十行堆栈全没了——这几乎100%是日志框架没把异常完整序列化进单条日志,而是拆成多行发给了Filebeat或Logstash。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 确保
logback-spring.xml中appender的layout用了%ex{full}(不是%ex或%throwable),否则只输出首行 - 禁用
logback的immediateFlush=false(尤其在异步appender下),否则异常堆栈可能被截断 - Filebeat配置里
multiline.pattern: '^\d{4}-\d{2}-\d{2}'这类正则必须匹配日志开头时间戳,且multiline.negate: true和multiline.match: after要配对,不然堆栈行被当成新事件切开
Spring Boot 3 + Jakarta EE环境下Sentry报NoClassDefFoundError: javax/servlet/Filter
升级到Spring Boot 3后,sentry-spring-boot-starter旧版(如6.x)直接抛这个错——因为javax.*包全被换成jakarta.*,而老版Sentry还依赖javax.servlet.Filter做自动埋点。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 必须升级到
sentry-spring-boot-starter7.0+(对应sentry-java7.x),它已切换为jakarta.servlet.Filter - 检查
mvn dependency:tree输出,排除残留的javax.servlet-api传递依赖(尤其是被spring-boot-starter-web旧快照版本引入的) - 若用WebFlux而非MVC,
sentry-spring-boot-starter7.x默认不启用WebFlux支持,需手动加@Bean注册SentryWebFluxFilter
ELK里查NullPointerException太慢?别只靠message字段全文检索
在Kibana里搜message: "NullPointerException",响应要5秒以上,且容易误匹配日志里的字符串字面量(比如代码注释、SQL语句)。问题出在ES默认把message当text类型分词索引,没法精准匹配异常类名。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- Logstash filter里用
dissect或grok从日志提取exception_type字段(例如java.lang.NullPointerException),并映射为ES的keyword类型 - Kibana里直接查
exception_type: "java.lang.NullPointerException",毫秒级返回 - 如果用Filebeat直连ES,改
filebeat.yml里的processors,加add_fields配合dissect解析器,避免Logstash成为瓶颈
异常监控不是配完就完事——Sentry的beforeSend钩子里过滤掉调试日志、ELK里exception_type字段的mapping一旦设错就得reindex,这些细节卡住就看不到真实错误。










