最近想把以前作过的日志项目及我的的思考梳理一下,因而有了本文。前端
咱们这边应用部署的环境比较复杂,主要有如下几种:git
部署环境不统一,致使查看应用日志很不方便。github
与部署环境对应,对于日志收集需求分为如下几类:docker
具体业务需求能够拆分为:后端
需求已经明确了,下面看一下业界方案。安全
上图的架构是业界比较通用的一种架构,对于各类场景都考虑的比较全。微信
既然业界的架构已经这么完备,那么咱们是否就直接采用呢?网络
对于咱们而言,有如下几个问题:架构
选择组件,咱们这边主要是从如下几个方面进行考量的:app
一提到日志收集方案,你们第一个想到的确定是ELK(Elasticsearch、Logstash、Kibana ),但Logstash依赖于JVM不论是性能仍是简洁性,都不是日志收集agent的首选。
我的感受一个好的agent应该是资源占用少,性能好,不依赖别的组件,能够独立部署。而Logstash明显不符合这几点要求,也许正是基于这些考虑elastic推出了Filebeat。
Elasticsearch集群在部署的时候,通常都是提早估计好容量、机器、shard等信息,由于Elasticsearch集群运行后,再水平拓展,比较麻烦,而咱们这边因为业务及成本限制没法很好的预估容量,因此就结合公司实际要求:使用日志服务的业务方自带机器,也就是业务方会有独立的Elasticsearch集群。
每一个业务方都使用本身的Elasticsearch集群,因此集群压力不会很大,从而Collector、MQ这两个组件对于咱们的做用也就很小了。
由于Elasticsearch Ingest Node彻底能够知足咱们的解析需求,因此就没有必要再引入Logstash等相关组件了。
到这里,基本能够看出咱们的架构以下:
架构设计的几个原则:
- 合适优于业界领先
- 简单优于复杂
- 演化优于一步到位
基于需求及EFK套件,梳理咱们场景中特有的东西:
具体规则及解析见下图(实例部分处理暂未标注):
推荐写日志到文本文件中,使用标准输出就好。
到这里能够发现咱们选择Filebeat来做为日志的收集端,Elasticsearch来存储日志并提供检索能力。
那么,日志的清洗在哪里作呢?
日志的清洗通常有两种方式:
对于,咱们的场景而言,咱们须要清洗数据的要求比较简单,主要是应用、实例名称的截取还有文本日志中日志时间的处理(@timestamp重置,时区处理),因此咱们选择了方案2。
在咱们的方案中,并无提供Kibana 的界面直接给用户用,而是咱们本身根据公司业务独立开发的。
前端界面为何不采用Kibana,而须要本身开发?
log-search提供的功能能够参见github:github.com/jiankunking…
若是日志须要清洗的比较多,能够采用方案1,或者先不清洗,先把数据落到Elasticsearch,而后在查询的时候,进行处理。好比在咱们的场景中,能够先把日志落到Elasticsearch中,而后在须要检索应用名称的时候,经过代码来处理并获取app名字。
其实基于日志能够作不少事情,好比:
具体思路,能够参见下图:
前提:能要求使用方,按照某种规则打印日志。 监控发展:监控基本就是先打通链路trace,而后再在上报信息或者日志信息中,增强业务方面标识,即给监控添加业务维度方面的视角。
以DaemonSet方式部署Filebeat来收集日志,其实收集也是宿主机/var/lib/docker/containers目录下的日志。 Running Filebeat on Kubernetes
一个POD中运行一个sidecar的日志agent容器,用于采集该POD主容器产生的日志。
莫名想起了istio。
Filebeat能够以sidecar模式来进行容器日志的收集,也就是filebeat和具体的服务容器部署在同一个pod内,指定收集日志的路径或文件,> 便可将日志发送到指定位置或Elasticsearch这类的搜索引擎。 每一个pod内部署filebeat的模式,好处是和具体的应用服务低耦合,可扩展性强,不过须要在yaml进行额外配置。
我的微信公众号:
我的github:
我的博客: