1、为什么需要日志系统?

首先咱们会想到分布式日志管理系统 ELK。

分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。

Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

今天说的是EFK F是FileBeat,隶属于Beats,是个搜集文件数据。

FileBeat对比Logstash :

LogStash出现的时间相对Beats较早,使用java写的,相关插件使用jruby写的,对于机器消耗的资源会比Beats消耗很多,Beats(Beats包括的子产品有FileBeat,MetricBeat等,FileBeat用于采集日志)是用go语言写的在性能上更胜一筹,而且非常轻量级占用的系统资源更少,但是Beats相对于LogStash的插件更少,对于快速搭建日志系统已经够用了,后续也会给出在日志量增加的情况下怎么升级日志系统。

2.开始搭建 docker+EFK

先说一下注意事项

  1. 只是简单的方案,目前存在日志收集完,日志散乱
  2. 多服务日志配置比较繁琐,需要更熟悉filebeat。(多服务日志建议挂载一个目录下)
  3. EFK镜像版本一定要一致
  4. 使用Filebeat既可能产生数据重复(至今不会解决哈哈哈)
  5. Es配置合理的内存

1.1 首先使用docker拉取镜像(一定要6.7版本以上的): 当前是7.7.1

docker pull  elasticsearch:7.7.1

等待拉取镜像即可(这里拉取可能会很慢,因为镜像在dockerHub上,可以去配置国内的镜像加速器,这里推荐两个一个是阿里云的镜像加速,一个是DAOCloud的镜像加速 都不错,读者可以根据自己的网络情况都试一下,在配置文件中配置registry-mirrors"即可。

1.2 拉取完成 查看镜像 :

docker  images

plg收集docker日志 elk收集docker日志_docker

]

1.3 启动 es

docker run -d -e ES_JAVA_POTS="-Xms512m -Xmx512m" -e “discovery.type=single-node” -p 9200:9200 -p 9300:9300 --name es7.7.1 830a894845e3

1.4 启动 es 后 查看es 是否已启动

docker ps

plg收集docker日志 elk收集docker日志_kibana_02

curl  "127.0.0.1:9200"

plg收集docker日志 elk收集docker日志_docker_03

显示这个说明你安装成功了

1.5 进去es 容器

docker exit【container id 】 /bin/bash

1.6 解决跨域问题 修改ElasticSearch配置文件,config下:ElasticSearch.yml在最后面加两行代码

vi   config/elasticSearch.yml

点击 i 插入

http.cors.enabled: true

http.cors.allow-origin: "*"

退出插入:esc 退出编辑 : 按键 + 字母 wq!

1.7 编辑完退出容器 : exit

重启es :

docker  restart  【CONTAINER ID】

(不知道 CONTAINER ID 的 ,先 docker ps 一下 复制黏贴一下哦 )

es 搭建完毕,相对solr 简单很多!!!

2.kibanna 安装及配置

docker  pull  kibbna:7.7.1

2.1 启动kibana镜像

docker run --link f6b8b11a0acb:elasticsearch -p 5601:5601 -d  --name kibana7.7.1 6de54f813b39

这里启动不一样的是多了 --link 选项,作用是将两个容器关联到一起可以互相通信,因为kibana到时候需要从ElasticSearch中拿数据。当然也可以通过 --network 创建自己的局域网连接各个容器。

这里需要配置kibana.yml,不然kibana默认通过localhost是找不到ES的。

2.2 进入kibana 进入容器命令行模式

docker exec -it 8180d5fdcdcf /bin/bash

2.3 修改kibana.yml文件

vi config/kibana.yml


server.name: kibana server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ] monitoring.ui.container.elasticsearch.enabled: true 
i18n.locale: "zh-CN"

退出插入:esc 退出编辑 : 按键 + 字母 wq!

这里主要添加两个一个es的地址,http://xxx:9200,xxx就是刚刚link起的别名,另外就是‘i18n.locale’语言配置,kibana默认是英文界面,修改外为zh-CN就可以汉化

**2.4 重启kibana : **

docker  restart  【CONTAINER ID】

(不知道 CONTAINER ID 的 ,先 docker ps 一下 复制黏贴一下哦 )

3.搭建 filebeat (最坑的是格式不对齐,格式不对直接错误)

3.1 先search 一下 (我在这里被坑了)

docker search  filebeat

plg收集docker日志 elk收集docker日志_kibana_04

3.2 在拉取

docker  pull elastic/filebeat:7.7.1

拉取完成之后,先不着急启动,在启动之前需要完成先建立一份映射的配置文件filebeat.docker.yml,选择目录创建filebeat.docker.yml

3.3 这里我直接上我自己测试的配置文件吧

filebeat.inputs:
# 多个后端服务,每个后端服务日志目录不同,给不同的日志目录设置不同的tag
- type: log
  # 更改为true以启用此输入配置
  enabled: true
  #解决中文乱码问题
  encoding: GB2312
  #过滤日志字段
  #您可以添加可用于过滤日志数据的字段。字段可以是标量值,数组,字典或它们的任何嵌套组合。默认情况下,
  #您在此处指定的字段将被分组fields到输出文档中的子词典下。要将自定义字段存储为顶级字段,
  #请将fields_under_root选项设置为true。如果在常规配置中声明了重复字段,则其值将被此处声明的值覆盖。
  fields:
    type: s1
  paths:
    #- /var/log/*.logs
    #- c:\programdata\elasticsearch\logs\*
    - G:\\s1.log
- type: log
  # 更改为true以启用此输入配置
  enabled: true
  #解决中文乱码问题
  encoding: GB2312
  #过滤日志字段
  #您可以添加可用于过滤日志数据的字段。字段可以是标量值,数组,字典或它们的任何嵌套组合。默认情况下,
  #您在此处指定的字段将被分组fields到输出文档中的子词典下。要将自定义字段存储为顶级字段,
  #请将fields_under_root选项设置为true。如果在常规配置中声明了重复字段,则其值将被此处声明的值覆盖。
  fields:
    type: s2
  # Paths that should be crawled and fetched. Glob based paths.
  #paths也是数组(下面也有-这个符号),path用于指定日志路径。
  paths:
    #- /var/log/*.log
    #- c:\programdata\elasticsearch\logs\*
    - G:\s2.log
	#pattern:多行日志开始的那一行匹配的pattern
    #negate:是否需要对pattern条件转置使用,不翻转设为true,反转设置为false
    #match:匹配pattern后,与前面(before)还是后面(after)的内容合并为一条日志
  multiline.pattern: ^\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}|^\[|^[[:space:]]+(at|\.{3})\b|^Caused by:'
  multiline.negate: false
  multiline.match: after  
# ============================== Filebeat modules ==============================
filebeat.config.modules:
  # Glob pattern for configuration loading
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
# ======================= Elasticsearch template setting =======================
setup.template.settings:
  index.number_of_shards: 1 #指定索引的分片
  output.elasticsearch: #输出到elasticsearch集群,没用集群就写本机或者一个就行了
  hosts: ["127.0.0.1:9300"]
  ##输出到console
   #filebeat断电异常关闭,会自动修改yml文件的 enabled: true属性为false,请注意查看
   #Filebeat Console(标准输出):Filebeat将收集到等数据,输出到console里,一般用于开发环境中,用于调试。
 #output.console:
 #   pretty: true
 #   enable: true
  #index.codec: best_compression
  #_source.enabled: false
# =================================== Kibana ===================================
setup.kibana:
  host: "127.0.0.1:5601"
# ================================== Outputs ==================================
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["127.0.0.1:9200"]
  indices:
  # 注意!!! 对应es 创建索引名称 。 统一前缀或者后缀 。多服务想一起查询某个数据,以便于以后在kibana创建索引模型可以同时匹配)
    - index: "s_1_%{+yyyy.MM.dd}"
      when.equals:
	  #对应filebeat.inputs: type字段
         fields.type: "s1"
    - index: "s_2_%{+yyyy.MM.dd}"
      when.equals:
         fields.type: "s2"
  # Protocol - either `http` (default) or `https`.
  #protocol: "https"
  # Authentication credentials - either API key or username/password.
  #api_key: "id:api_key"
  #username: "elastic"
  #password: "changeme"
   #indices:
processors:
#需要删除的标签  我觉得没用的标签
- drop_fields:  
    fields: ["input_type", "log.offset", "host.name", "input.type", "agent.hostname", "agent.type", "ecs.version", "agent.ephemeral_id", "agent.id", "agent.version", "fields.ics", "log.file.path", "log.flags", "host.os.version", "host.os.platform","host.os.family", "host.os.name", "host.os.kernel", "host.os.codename", "host.id", "host.containerized", "host.hostname", "host.architecture"]

3.4 启动filebeat

docker run -d -v /xxx/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml -v /xxx/logs/:/xxx/logs/ --link f6b8b11a0acb:elasticsearch --link 8180d5fdcdcf:kibana  --name filebeat7.7.1   a4c1bdadf04d

这里 -v 就是挂在目录的意思就是将自己本地的目录挂载到容器当中,第一个挂载映射的是配置文件,第二个是要收集的日志目录,如果不挂载日志目录的话,filebeat是不会收集日志的,因为在容器里面根本找不到要收集的路径。

3.5 启动后在kibana里面查看收集的日志

plg收集docker日志 elk收集docker日志_kibana_05

点击索引模式,然后点击右上角创建索引模型

plg收集docker日志 elk收集docker日志_plg收集docker日志_06

这里为什么说创建索引时候要前缀一样,多服务创建多个索引 可以匹配到一起。可以通过链路id 查询到多服务数据!

日志信息:

plg收集docker日志 elk收集docker日志_es_07

搭建完成

----------------------------------------------------------------------------------------------------

ElasticSearch

Elaticsearch,简称为ES,ES是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别(大数据时代)的数据。ES由 Java 语言开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTFULL API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。据国际权威的数据库产品评测机构 DB Engines 的统计,在2016 年1月,ElasticSearch 已超过 Solr 等,成为排名第一的搜索引擎类应用。

ES和Solr的差别

1.es基本是开箱即用,非常简单。Solr安装略微复杂一丢丢

2.Solr利用Zookeeper进行分布式管理,而Elasticsearch自身带有分布式协调管理功能。

3.Solr查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用﹔

4.Solr官方提供的功能更多,而Elasticsearch本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana友好支撑

6.Solr比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而Elasticsearch相对开发维护者较少,更新太快,学习使用成本较高。

Filebeat

当开启filebeat程序的时候,它会启动一个或多个探测器(prospectors)去检测指定的日志目录或文件,对于探测器找出的每一个日志文件,filebeat启动收割进程(harvester),每一个收割进程读取一个日志文件的新内容,并发送这些新的日志数据到处理程序(spooler),处理程序会集合这些事件,最后filebeat会发送集合的数据到你指定的地点。

熟悉目录

bin 启动文件

config 配置文件

log4j 日志配置文件

jvm.options java虚拟机相关的配置

ElasticSearch.yml ElasticSearch的配置文件 默认9200端口

lib 相关jar包

logs 日志

modules 功能模块

plugins 插件

----------------------------------------------------------------------------------------------------------------------------------

上图是Filebeat的结构图。 上图左边灰色框中就是Filebeat,右边是Filebeat的输出对象,Filebeat可以将日志输出到Elasticsearch,Logstash,Kafka,redis等。

Filebeat是一款使用go语言开发的,主要是对日志文件进行处理的,是一个属于Beats系列的日志托运者 (一组安装在主机上的轻量级托运人),用于将不同类型的数据传送到ELK堆栈进行分析。每个Beat专门用于传送不同类型的信息,例如,Winlogbeat发布Windows事件日志,Metricbeat发布主机指标等等。顾名思义,Filebeat提供日志文件。

Filebeat处理流程

1. 日志文件输入(Input)。

2. 处理日志文件(Filter)。

3. 输出到目标对象中(Output)。

Filebeat的组成

根据上图可以看到Filebeat由两个主要组件组成,prospector 和 harvester。

1. harvester(收割者):

负责读取单个文件的内容。

如果文件在读取时被删除或重命名,Filebeat将继续读取文件。

2. prospector(观察者):

prospector负责管理harvester并找到所有要读取的文件来源,主要监控文件是否变化,如果输入类型为日志,则查找器将查找路径匹配的所有文件,并为每个文件启动一个harvester(上图prospector1就有两个harvester),如果文件有变化harvester就会收集新的日志。

Filebeat可以有多个prospector,每个prospector负责的文件是不同的。

Kibana

Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana ,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板( dashboard ) 实时显示Elasticsearch查询动态。设置Kibana非常简单。无需编码或者额外的基础架构,几分钟内就可以完成Kibana安装并启动Elasticsearch索引监测。

很强很强很强!

Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能.

市面上很多开发只要提到ELK能够一致说出它是一个日志分析架构技术栈总称,但实际上ELK不仅仅适用于日志分析,它还可以支持其它任何数据分析和收集的场景,日志分析和收集只是更具有代表性。并非唯一性。

Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana ,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板( dashboard ) 实时显示Elasticsearch查询动态。设置Kibana非常简单。无需编码或者额外的基础架构,几分钟内就可以完成Kibana安装并启动Elasticsearch索引监测。

很强很强很强!

Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能.

市面上很多开发只要提到ELK能够一致说出它是一个日志分析架构技术栈总称,但实际上ELK不仅仅适用于日志分析,它还可以支持其它任何数据分析和收集的场景,日志分析和收集只是更具有代表性。并非唯一性。

plg收集docker日志 elk收集docker日志_kibana_08

屌屌的