Sentry是一款应用监控系统,可用于各种前后端技术栈的在线监控和错误分析。本次我们将其用于SpringBoot项目实践的在线日志分析。要创建项目,首先需要根据提示在哨兵中创建项目。项目平台(platform)可以选择SpringBoot或者Java。引入依赖和配置Sentry提供了官方的SpringBootStarter。io.sentrysentry-spring-boot-starter3.1.1另外我们还需要配置application.properties,导入我们在Sentry中创建的项目密钥(DSN):sentry.dsn=https://key@host/id第一个错误是编写我们的Controller,试图抛出一个简单的异常。@RestControllerpublicclassHelloController{@RequestMapping("/")publicvoidtest(){thrownewIllegalArgumentException("helloworld");}}如果之前的配置没有问题,那么我们可以在Sentry的“Issue”面板看到异常信息。单击异常以查看其详细信息。可以看到这个异常的一些基本信息,比如“用户信息(此处未设置)”、“用户环境”、“标签(Tag)”、“调用栈跟踪(StackTrace)”、“日志切片(Breadcrumbs)”,“RequestHeaders”,以及一些用户定义的内容(称为Context)。这里想介绍一下哨兵中的一个概念。首先,在同一个地方产生的异常会归纳为一个“Issue”,在这个地方产生的每个异常称为“Event”。所以如果在同一个地方触发了两次异常,仍然只有一个Issue,但是在Event页面可以看到两个事件。由于自定义用户信息已经知道这个异常,所以我们也想知道是哪个用户触发了这个异常。SentrySDK提供了SentryUserProvider,可用于在异常发生时提供用户信息。我们只需要配置一个Bean。@BeanpublicSentryUserProvidersentryUserProvider(){return()->{//实际用户信息,可能需要通过其他方式获取Useruser=newUser();user.setId("userId");user.setUsername("张三");user.setEmail("zhangsan@gmail.com");returnuser;};}再次触发异常,获取用户信息。自定义Tags使用Tags过滤异常随着异常信息的增多,我们希望过滤掉一些特定的异常信息。Sentry提供了“标签(Tag)”功能,可以根据标签进行过滤。虽然内置的Tags已经够多了,但我们还是希望能根据业务需要自定义一些。当然,SentrySDK提供了BeforeSendCallback,所以我们可以添加一些Tags。@BeanpublicSentryOptions.BeforeSendCallbackbeforeSendCallback(){return(event,hint)->{event.setTag("name","zhangsan");returnevent;};}可以看到我们的Tag添加成功了,点击这个Tag可以找到所有包含此标签的事件。集成Logback我们现有的SpringBoot业务可能会覆盖异常处理,大部分异常可能会直接记录为日志。当然,Sentry也提供了对Logback/Log4j2等日志框架的支持。只需导入相应的依赖项即可。这里我们以Logback为例。io.sentrysentry-logback3.1.1SentrySpringBootStarter会自动监控依赖并为我们配置通过相应的配置,我们可以直接使用log来代替原来抛出的异常。@RestControllerpublicclassHelloController{privatestaticLoggerlogger=LoggerFactory.getLogger(HelloController.class);@RequestMapping("/")publicvoidtest(){logger.error("Logbackerror!");}}这里有趣的一点是,对于未处理的异常异常,Sentry会给他一个fatal级别,引入Logback后,会使用logger的日志级别。通过在配置文件中配置minimum-event-level和minimum-breadcrumb-level,我们可以指定哪些日志级别会产生一个“Event”,哪些日志级别会记录一个“日志片段(Breadcrumbs)”。注意前提是logger的级别低于或等于这个级别(否则不会被采集)。sentry.logging.minimum-event-level=infosentry.logging.minimum-breadcrumb-level=debug自建哨兵除了官方版本,你还可以自建一个哨兵版本。正式版有使用限制,可能需要付费;自托管版本无使用限制,但官方不提供技术支持。自建Sentry也很简单,需要Docker和DockerCompose,硬件上至少需要2.4G空闲内存。gitclonehttps://github.com/getsentry/onpremise.gitcdonpremise./install.sh后,在localhost:9000可以看到自建的Sentry,可以配合Nginx反向代理使用,调整端口为80/443。