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
先说一下注意事项
- 只是简单的方案,目前存在日志收集完,日志散乱
- 多服务日志配置比较繁琐,需要更熟悉filebeat。(多服务日志建议挂载一个目录下)
- EFK镜像版本一定要一致
- 使用Filebeat既可能产生数据重复(至今不会解决哈哈哈)
- Es配置合理的内存
1.1 首先使用docker拉取镜像(一定要6.7版本以上的): 当前是7.7.1
docker pull elasticsearch:7.7.1
等待拉取镜像即可(这里拉取可能会很慢,因为镜像在dockerHub上,可以去配置国内的镜像加速器,这里推荐两个一个是阿里云的镜像加速,一个是DAOCloud的镜像加速 都不错,读者可以根据自己的网络情况都试一下,在配置文件中配置registry-mirrors"即可。
1.2 拉取完成 查看镜像 :
docker images
]
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
curl "127.0.0.1:9200"
显示这个说明你安装成功了
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
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里面查看收集的日志
点击索引模式,然后点击右上角创建索引模型
这里为什么说创建索引时候要前缀一样,多服务创建多个索引 可以匹配到一起。可以通过链路id 查询到多服务数据!
日志信息:
搭建完成
----------------------------------------------------------------------------------------------------
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不仅仅适用于日志分析,它还可以支持其它任何数据分析和收集的场景,日志分析和收集只是更具有代表性。并非唯一性。
屌屌的