对于一个已经上线的系统,存在未知的bug或者运行时发生异常是很常见的事情,随之而来的几点需求产生了:
一、系统发生异常时是否可以经过日志查看到具体缘由
二、怎样第一时间扑捉到异常
三、系统都出现了哪些异常
四、哪些异常出现频率高
第一点好解决,利用log4j、logback等日志框架把异常信息(stacktrace,params)打印到日志文件,能够在查找时很方便看到相信信息。可是这样每每具备滞后性,等到用户反馈或者系统崩溃的时候才去线上查看日志找到缘由,可能异常已经发了好几天了,损失很大。因此第二点显得格外重要,怎样作到第一时间捕捉到异常呢?你大能够tail -f yourlog.log盯着屏幕一直看,出现异常立刻解决,可是日志数量大、分布在多个服务器的时候这样的作法确定行不通了,因此须要有监控措施,第一时间告警。对于第三和第四点则是须要对异常进行分类统计。
因此一个日志收集系统的原型勾勒出来了:具有收集日志(对于分布式环境下,日志分布在各台服务器上)、日志统计(统计次数最多的异常,每每这就是系统的隐患所在)、监控告警(出现异常或者异常积累到必定数量以短信或者邮件的形式告警)、以及以上功能的可视化界面。其实本身去开发这样一个系统仍是有难度的,好在目前已经有好的开源产品可以直接使用了,这就是Sentry,一个基于Djongo的日志收集系统。Sentry的界面漂亮、支持的语言和框架多、易于扩展、效率不错。
Sentry的安装和配置网上有不少教程,难度不大。Sentry是c/s结构的软件,因此部署好了服务器端之后还须要客户端,Sentry的客户端支持python/php/ruby/java等语言而且支持在众多框架中集成。
以和Java的logback集成为例:
在项目的pom.xml文件中配置Sentry客户端的依赖:
<!-- sentry raven-java configuration -->
- <dependency>
- <groupId>net.kencochrane.raven</groupId>
- <artifactId>raven-logback</artifactId>
- <version>4.1.1</version>
- </dependency>
<!-- jaskson configuration -->
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- <version>2.3.0</version>
- </dependency>
<!-- sentry appender configuration -->
- <appender name="Sentry" class="net.kencochrane.raven.logback.SentryAppender">
- <dsn>
- http:
- </dsn>
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>ERROR</level>
- </filter>
- </appender>
dsn中须要配置api keys,这个在sentry的项目配置中能够获得,一切就是这么简单,无缝集成,不影响现有的日志打印,还能帮助收集异常、统计异常,多好的事情,呵呵,下面附上一张咱们部署的sentry系统的截图,敏感信息用线条抹去了请谅解。