diff --git a/common/mall-spring-boot-starter-sentry/pom.xml b/common/mall-spring-boot-starter-sentry/pom.xml
new file mode 100644
index 000000000..54c0edd9d
--- /dev/null
+++ b/common/mall-spring-boot-starter-sentry/pom.xml
@@ -0,0 +1,25 @@
+
+
+
+ common
+ cn.iocoder.mall
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ mall-spring-boot-starter-sentry
+
+
+
+ io.sentry
+ sentry-spring-boot-starter
+
+
+ io.sentry
+ sentry-logback
+
+
+
+
\ No newline at end of file
diff --git a/common/mall-spring-boot-starter-sentry/src/main/java/cn/iocoder/mall/sentry/config/CustomSentryAutoConfiguration.java b/common/mall-spring-boot-starter-sentry/src/main/java/cn/iocoder/mall/sentry/config/CustomSentryAutoConfiguration.java
new file mode 100644
index 000000000..05bb03742
--- /dev/null
+++ b/common/mall-spring-boot-starter-sentry/src/main/java/cn/iocoder/mall/sentry/config/CustomSentryAutoConfiguration.java
@@ -0,0 +1,38 @@
+package cn.iocoder.mall.sentry.config;
+
+import cn.iocoder.mall.sentry.resolver.DoNothingExceptionResolver;
+import io.sentry.spring.SentryExceptionResolver;
+import io.sentry.spring.autoconfigure.SentryAutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.HandlerExceptionResolver;
+
+/**
+ * 自定义的 Sentry 自动配置类
+ *
+ * @author Hccake 2020/8/6
+ * @version 1.0
+ */
+@ConditionalOnClass({HandlerExceptionResolver.class, SentryExceptionResolver.class})
+@ConditionalOnWebApplication
+@ConditionalOnProperty(name = "sentry.enabled", havingValue = "true", matchIfMissing = true)
+@Configuration(proxyBeanMethods = false)
+public class CustomSentryAutoConfiguration {
+
+ /**
+ * 用于覆盖原有的 SentryStarter 提供的 SentryExceptionResolver 操作
+ * 解决使用 log appender 形式推送错误信息与全局异常捕获导致重复推送的情况
+ *
+ * @return DoNothingExceptionResolver
+ */
+ @Bean
+ @ConditionalOnClass(SentryAutoConfiguration.class)
+ @ConditionalOnMissingBean(SentryExceptionResolver.class)
+ public SentryExceptionResolver doNothingExceptionResolver() {
+ return new DoNothingExceptionResolver();
+ }
+}
diff --git a/common/mall-spring-boot-starter-sentry/src/main/java/cn/iocoder/mall/sentry/resolver/DoNothingExceptionResolver.java b/common/mall-spring-boot-starter-sentry/src/main/java/cn/iocoder/mall/sentry/resolver/DoNothingExceptionResolver.java
new file mode 100644
index 000000000..6cd0ac8e7
--- /dev/null
+++ b/common/mall-spring-boot-starter-sentry/src/main/java/cn/iocoder/mall/sentry/resolver/DoNothingExceptionResolver.java
@@ -0,0 +1,32 @@
+package cn.iocoder.mall.sentry.resolver;
+
+import io.sentry.spring.SentryExceptionResolver;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 默认什么也不做的 SentryExceptionResolver
+ *
+ * @author Hccake 2020/8/6
+ * @version 1.0
+ */
+public class DoNothingExceptionResolver extends SentryExceptionResolver {
+
+ @Override
+ public ModelAndView resolveException(HttpServletRequest request,
+ HttpServletResponse response,
+ Object handler,
+ Exception ex) {
+ // do nothing here
+
+ // null = run other HandlerExceptionResolvers to actually handle the exception
+ return null;
+ }
+
+ @Override
+ public int getOrder() {
+ return Integer.MIN_VALUE;
+ }
+}
\ No newline at end of file
diff --git a/common/mall-spring-boot-starter-sentry/src/main/resources/META-INF/spring.factories b/common/mall-spring-boot-starter-sentry/src/main/resources/META-INF/spring.factories
new file mode 100644
index 000000000..befade37d
--- /dev/null
+++ b/common/mall-spring-boot-starter-sentry/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+cn.iocoder.mall.sentry.config.CustomSentryAutoConfiguration
diff --git a/common/pom.xml b/common/pom.xml
index 6a472828e..34ea1fa22 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -19,6 +19,7 @@
mall-security-annotations
mall-spring-boot-starter-security-admin
mall-spring-boot-starter-security-user
+ mall-spring-boot-starter-sentry
mall-spring-boot-starter-mybatis
mall-spring-boot-starter-dubbo
mall-spring-boot-starter-system-error-code
diff --git a/mall-dependencies/pom.xml b/mall-dependencies/pom.xml
index 3bdbe4439..da3718609 100644
--- a/mall-dependencies/pom.xml
+++ b/mall-dependencies/pom.xml
@@ -55,6 +55,7 @@
8.0.1
2.2.2
+ 1.7.30
1.2.56
6.0.16.Final
@@ -275,6 +276,17 @@
${spring-boot-admin-starter-client.version}
+
+ io.sentry
+ sentry-logback
+ ${sentry.version}
+
+
+ io.sentry
+ sentry-spring-boot-starter
+ ${sentry.version}
+
+
@@ -350,6 +362,7 @@
hibernate-validator
${hibernate-validator.version}
+