Spring Boot整合 Sentry 监控项目日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

Sentry Java版使用简介


基本概念


  • Sentry是什么?


Sentry 是一个开源的实时错误报告工具,支持 web 前后端、移动应用以及游戏,支持 Python、OC、Java、Go、Node、Django、RoR 等主流编程语言和框架 ,还提供了 GitHub、Slack、Trello 等常见开发工具的集成。


  • DSN(Data Source Name)


Sentry 服务支持多用户、多团队、多应用管理,每个应用都对应一个 PROJECTID,以及用于身份认证的 PUBLICKEY 和 SECRET_KEY。由此组成一个这样的 DSN:

'{PROTOCOL}://{PUBLICKEY}:{SECRETKEY}@{HOST}/{PATH}{PROJECT_ID}'


PROTOCOL 通常会是 http 或者 https,HOST 为 Sentry 服务的主机名和端口,PATH 通常为空。 为方便管理,每个应用生成一个 DSN。


使用 Sentry SDK


Sentry 的 SDK 通常在各语言的包管理器中成为 Raven,使用起来也非常简单。以 Java版本为例(使用SpringBoot框架):


1.首先项目中pom文件安装 Raven

 
 
  1.    <!--导入Sentry-->

  2.    <dependency>

  3.       <groupId>com.getsentry.raven</groupId>

  4.       <artifactId>raven-logback</artifactId>

  5.       <version>8.0.2</version>

  6.   </dependency>

2.在项目配置文件中建立logback.xml

 
 
  1. <configuration>

  2.    <!-- 彩色日志 -->

  3.    <!-- 彩色日志依赖的渲染类 -->

  4.    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>

  5.    <conversionRule conversionWord="wex"

  6.                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>

  7.    <conversionRule conversionWord="wEx"

  8.                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

  9.    <!-- 彩色日志格式 -->

  10.    <property name="CONSOLE_LOG_PATTERN"

  11.              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(--){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>/>

  12.    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">

  13.        <encoder>

  14.            <!--<pattern> %d{YYYY-MM-dd HH:mm:ss.SSS} [%-5level] -&#45;&#45; %logger{36} [%thread] \t- %msg%n%nopex</pattern>-->

  15.            <pattern>${CONSOLE_LOG_PATTERN}</pattern>

  16.        </encoder>

  17.    </appender>

  18.    <appender name="Sentry" class="com.getsentry.raven.logback.SentryAppender">

  19.        <!--每个项目生成不通的key-->

  20.        <dsn>http://d73b23c481654b9ca0e4e8a9db310169:daaf5dc2edef462690791ef324316738@sentry.boluome.com/7</dsn>

  21.        <!-- 设置拦截的最低级别为warn 警告-->

  22.        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">

  23.            <level>WARN</level>

  24.        </filter>

  25.    </appender>

  26.    <logger name="logback.SentryAppenderIT" level="INFO">

  27.        <appender-ref ref="Sentry"/>

  28.    </logger>

  29.    <root level="INFO">

  30.        <appender-ref ref="Console"/>

  31.        <appender-ref ref="Sentry"/>

  32.    </root>

  33. </configuration>


3.application.propertes中添加导入日志配置【主要要提前在pom文件中添加包含*.xml,否则会报错,not found file】

logging.config=classpath:logback.xml

4.接口层,正常使用logger等方法。Raven会自动把warn级别通过tcp发送到日志中心,并通知相关人员查看信息

 
 
  1.   @RequestMapping(value = "/testlog", method = RequestMethod.GET)

  2.    public void testLog() {

  3.        logger.info("test接口");//最低拦截级别为warn,所以info不会输出发送到日志中心

  4.        logger.error("error"); //会显示在日志中心,并邮件通知相关联系人

  5.    }

这样就可以使用 Raven 对象向 Sentry 服务器中提交日志信息了。

使用 Sentry web 服务

主要是登录后台查看,后续有时间更新此部分文档。开通账号可找虎大师。

附录

sentry 官方文档

 
 
  1. <?xml version="1.0" encoding="UTF-8" ?>

  2. <!-- scan="true"    当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->

  3. <!--  scanPeriod="30 seconds"   设置每30秒自动扫描,若没有指定具体单位则以milliseconds为标准(单位:milliseconds, seconds, minutes or hours)  -->

  4. <!-- debug="false"当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->

  5. <configuration scan="true" scanPeriod="30 seconds">

  6.    <!-- 上下文名称  -->

  7.    <contextName>test</contextName>

  8.    <!-- 存放日志文件路径 -->

  9.    <property name="Log_Home" value="mylogs/test"/>

  10.    <!-- ch.qos.logback.core.ConsoleAppender 控制台输出 -->

  11.    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

  12.        <encoder>

  13.            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->

  14.            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</pattern>

  15.        </encoder>

  16.    </appender>

  17.    <!-- DEBUG级别 -->

  18.    <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">

  19.        <!-- 级别过滤器 -->

  20.        <filter class="ch.qos.logback.classic.filter.LevelFilter">

  21.            <!-- 设置过滤级别 -->

  22.            <level>DEBUG</level>

  23.            <!-- 用于配置符合过滤条件的操作 -->

  24.            <onMatch>ACCEPT</onMatch>

  25.            <!-- 用于配置不符合过滤条件的操作 -->

  26.            <onMismatch>DENY</onMismatch>

  27.        </filter>

  28.        <Encoding>UTF-8</Encoding>

  29.        <File>${Log_Home}/debug/debug.log</File>

  30.        <!-- 根据时间来制定滚动策略 -->

  31.        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

  32.            <FileNamePattern>

  33.                ${Log_Home}/debug/debug.%d{yyyy-MM-dd}.%i.log

  34.            </FileNamePattern>

  35.            <!-- 多久后自动清楚旧的日志文件,单位:月 -->

  36.            <MaxHistory>1</MaxHistory>

  37.            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

  38.                <!-- 默认值是 10MB,文档最大值 -->

  39.                <MaxFileSize>2MB</MaxFileSize>

  40.            </TimeBasedFileNamingAndTriggeringPolicy>

  41.        </rollingPolicy>

  42.        <encoder>

  43.            <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</Pattern>

  44.        </encoder>

  45.    </appender>

  46.    <!-- INFO级别 -->

  47.    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">

  48.        <!-- 级别过滤器 -->

  49.        <filter class="ch.qos.logback.classic.filter.LevelFilter">

  50.            <!-- 设置过滤级别 -->

  51.            <level>INFO</level>

  52.            <!-- 用于配置符合过滤条件的操作 -->

  53.            <onMatch>ACCEPT</onMatch>

  54.            <!-- 用于配置不符合过滤条件的操作 -->

  55.            <onMismatch>DENY</onMismatch>

  56.        </filter>

  57.        <Encoding>UTF-8</Encoding>

  58.        <File>${Log_Home}/info/info.log</File>

  59.        <!-- 根据时间来制定滚动策略 -->

  60.        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

  61.            <FileNamePattern>

  62.                ${Log_Home}/info/info.%d{yyyy-MM-dd}.%i.log

  63.            </FileNamePattern>

  64.            <!-- 多久后自动清楚旧的日志文件,单位:月 -->

  65.            <MaxHistory>1</MaxHistory>

  66.            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

  67.                <!-- 默认值是 10MB,文档最大值 -->

  68.                <MaxFileSize>2MB</MaxFileSize>

  69.            </TimeBasedFileNamingAndTriggeringPolicy>

  70.        </rollingPolicy>

  71.        <encoder>

  72.            <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</Pattern>

  73.        </encoder>

  74.    </appender>

  75.    <!-- WARN级别 -->

  76.    <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">

  77.        <!-- 级别过滤器 -->

  78.        <filter class="ch.qos.logback.classic.filter.LevelFilter">

  79.            <!-- 设置过滤级别 -->

  80.            <level>WARN</level>

  81.            <!-- 用于配置符合过滤条件的操作 -->

  82.            <onMatch>ACCEPT</onMatch>

  83.            <!-- 用于配置不符合过滤条件的操作 -->

  84.            <onMismatch>DENY</onMismatch>

  85.        </filter>

  86.        <Encoding>UTF-8</Encoding>

  87.        <File>${Log_Home}/warn/warn.log</File>

  88.        <!-- 根据时间来制定滚动策略 -->

  89.        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

  90.            <FileNamePattern>

  91.                ${Log_Home}/warn/warn.%d{yyyy-MM-dd}.%i.log

  92.            </FileNamePattern>

  93.            <!-- 多久后自动清楚旧的日志文件,单位:月 -->

  94.            <MaxHistory>1</MaxHistory>

  95.            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

  96.                <!-- 默认值是 10MB,文档最大值 -->

  97.                <MaxFileSize>2MB</MaxFileSize>

  98.            </TimeBasedFileNamingAndTriggeringPolicy>

  99.        </rollingPolicy>

  100.        <encoder>

  101.            <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</Pattern>

  102.        </encoder>

  103.    </appender>

  104.    <!-- ERROR级别 -->

  105.    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">

  106.        <!-- 级别过滤器 -->

  107.        <filter class="ch.qos.logback.classic.filter.LevelFilter">

  108.            <!-- 设置过滤级别 -->

  109.            <level>ERROR</level>

  110.            <!-- 用于配置符合过滤条件的操作 -->

  111.            <onMatch>ACCEPT</onMatch>

  112.            <!-- 用于配置不符合过滤条件的操作 -->

  113.            <onMismatch>DENY</onMismatch>

  114.        </filter>

  115.        <Encoding>UTF-8</Encoding>

  116.        <File>${Log_Home}/error/error.log</File>

  117.        <!-- 根据时间来制定滚动策略 -->

  118.        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

  119.            <FileNamePattern>

  120.                ${Log_Home}/error/error.%d{yyyy-MM-dd}.%i.log

  121.            </FileNamePattern>

  122.            <!-- 多久后自动清楚旧的日志文件,单位:月 -->

  123.            <MaxHistory>1</MaxHistory>

  124.            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

  125.                <!-- 默认值是 10MB,文档最大值 -->

  126.                <MaxFileSize>2MB</MaxFileSize>

  127.            </TimeBasedFileNamingAndTriggeringPolicy>

  128.        </rollingPolicy>

  129.        <encoder>

  130.            <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</Pattern>

  131.        </encoder>

  132.    </appender>

  133.    <!-- 控制java下面包的打印,没设置等级,将继承上级root的等级 -->

  134.    <logger name="rattlesnake.callback"/>

  135.    <!-- 当前日志总级别为TRACE、DEBUG、INFO、 WARN、ERROR、ALL和 OF -->

  136.    <!-- the level of the root level is set to DEBUG by default.       -->

  137.    <root level="DEBUG">

  138.        <appender-ref ref="STDOUT"/>

  139.        <appender-ref ref="FILE_DEBUG"/>

  140.        <appender-ref ref="FILE_INFO"/>

  141.        <appender-ref ref="FILE_WARN"/>

  142.        <appender-ref ref="FILE_ERROR"/>

  143.    </root>

  144. </configuration>

-END-



原文发布时间为:2018-10-08
本文作者:lxchinesszz
本文来自云栖社区合作伙伴“程序猿DD”,了解相关信息可以关注“程序猿DD”。
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
前端开发 安全 Java
Spring Boot 便利店销售系统项目分包设计解析
本文深入解析了基于Spring Boot的便利店销售系统分包设计,通过清晰的分层架构(表现层、业务逻辑层、数据访问层等)和模块化设计,提升了代码的可维护性、复用性和扩展性。具体分包结构包括`controller`、`service`、`repository`、`entity`、`dto`、`config`和`util`等模块,职责分明,便于团队协作与功能迭代。该设计为复杂企业级应用开发提供了实践参考。
136 0
|
3月前
|
监控 测试技术 Go
告别传统Log追踪!GOAT如何用HTTP接口重塑代码监控
本文介绍了GOAT(Golang Application Tracing)工具的使用方法,通过一个Echo问答服务实例,详细展示了代码埋点与追踪技术的应用。内容涵盖初始化配置、自动埋点、手动调整埋点、数据监控及清理埋点等核心功能。GOAT适用于灰度发布、功能验证、性能分析、Bug排查和代码重构等场景,助力Go项目质量保障与平稳发布。工具以轻量高效的特点,为开发团队提供数据支持,优化决策流程。
299 89
|
4月前
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
66 0
|
4月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
179 0
|
1月前
|
Prometheus 监控 Cloud Native
Spring Boot 可视化监控
本文介绍了如何通过Spring Actuator、Micrometer、Prometheus和Grafana为Spring Boot应用程序添加监控功能。首先创建了一个Spring Boot应用,并配置了Spring Actuator以暴露健康状态和指标接口。接着,利用Micrometer收集应用性能数据,并通过Prometheus抓取这些数据进行存储。最后,使用Grafana将Prometheus中的数据可视化,展示在精美的仪表板上。整个过程简单易行,为Spring Boot应用提供了基本的监控能力,同时也为后续扩展更详细的监控指标奠定了基础。
129 2
|
1月前
|
网络协议 Java
在SpringBoot项目中使用Netty实现远程调用
本文介绍了使用Netty解决网络连接性能问题的方法,重点讲解了Netty的NIO特性及其在SpringBoot中的应用。Netty作为高效的NIO框架,支持非阻塞IO,能通过单线程管理多个客户端连接,简化TCP/UDP套接字服务器开发。文章详细展示了Netty在SpringBoot中实现远程调用的过程,包括服务端与客户端代码实现、依赖配置及测试验证。通过示例代码,如`NettyServer`、`NettyClientUtil`等,清晰说明了Netty的工作原理和实际应用,解决了半包等问题,并提供了完整的测试结果。
122 3
|
2月前
|
Java 应用服务中间件 Linux
Tomcat运行日志字符错乱/项目启动时控制台日志乱码问题
总结: 通过以上几种方法,概括如下:指定编码格式、设置JVM的文件编码、修改控制台输出编码、修正JSP页面编码和设置过滤器。遵循这些步骤,你可以依次排查和解决Tomcat运行日志字符错乱及项目启动时控制台日志乱码问题。希望这些建议能对你的问题提供有效的解决方案。
310 16
|
3月前
|
消息中间件 运维 监控
智能运维,由你定义:SAE自定义日志与监控解决方案
通过引入 Sidecar 容器的技术,SAE 为用户提供了更强大的自定义日志与监控解决方案,帮助用户轻松实现日志采集、监控指标收集等功能。未来,SAE 将会支持 istio 多租场景,帮助用户更高效地部署和管理服务网格。
318 51
|
4月前
|
数据采集 运维 监控
数据采集监控与告警:错误重试、日志分析与自动化运维
本文探讨了数据采集技术从“简单采集”到自动化运维的演进。传统方式因反爬策略和网络波动常导致数据丢失,而引入错误重试、日志分析与自动化告警机制可显著提升系统稳定性与时效性。正方强调健全监控体系的重要性,反方则担忧复杂化带来的成本与安全风险。未来,结合AI与大数据技术,数据采集将向智能化、全自动方向发展,实现动态调整与智能识别反爬策略,降低人工干预需求。附带的Python示例展示了如何通过代理IP、重试策略及日志记录实现高效的数据采集程序。
194 7
数据采集监控与告警:错误重试、日志分析与自动化运维
|
3月前
|
SQL 前端开发 Java
深入理解 Spring Boot 项目中的分页与排序功能
本文深入讲解了在Spring Boot项目中实现分页与排序功能的完整流程。通过实际案例,从Service层接口设计到Mapper层SQL动态生成,再到Controller层参数传递及前端页面交互,逐一剖析每个环节的核心逻辑与实现细节。重点包括分页计算、排序参数校验、动态SQL处理以及前后端联动,确保数据展示高效且安全。适合希望掌握分页排序实现原理的开发者参考学习。
147 4