篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集中化日志管理平台的应用 ELK和filebeat简单配置 暂时没用相关的知识,希望对你有一定的参考价值。
名称
优势
劣势
常⽤
Logstash
插件多,资料充⾜,配置简单
性能⼀般,不⽀持缓存
采集,传
输
Filebeat
可靠,性能好,多种对接
存在注册表过⼤问题
采集
Fluentd
基于Ruby,插件多,易于编写和
维护
灵活性相对差,性能⼀般
采集
Logtail
资源占⽤少
尽做收集,类型解析较弱
采集
Logagent
轻量快速,⽀持缓存
灵活性差
采集,传
输
rsyslog
速度快,轻量化,规则灵活
配置繁杂,⽂档差,版本
差异
采集
Syslog-ng
性能好,⽂档相对⻬全
开源版本功能有限
采集
Kafka
可靠,稳定,⾼性能
容易重复消费
传输
Flume
可靠,容错性⾼,易管理,实时
配置繁琐
传输
ElasticSearch
分布式部署,⾃动故障转移
个⼈开发,还不够⾃动
存储
HDFS
⾼容错,⼤数据存储
延迟⾼,不适于⼩⽂件
存储
kibana
多种图标配置简单
仅⽀持es
展示,分
析
grafana
多数据源⽀持,⾃带警报
偏监控⽅向
分析,预
警
2、中间件
2.1 概述
⽇志的⽣命周期⼀般分为采集,传输,存储和分析四个环节,每个步骤有可⽤的中间件和⼯具。
选⽤中间件时所关注的⻆度:性能、可靠性、插件⽀持程度、配置复杂度
2.1.1 汇总
2.1.2 总结
企业实际实战中,elk是成熟且⼴泛使⽤的⽅案。
logstash因为性能弱于fifilebeat,并不直接运⽤于采集起点,⼀般使⽤fifilebeat。
进⼊elk前,经验性⻆度,放置kafka,⼀⽅⾯作为队列和缓冲,另⼀⽅⾯提供了统⼀的⼊⼝渠道。
2.2 部署
2.2.1 ES
1)简介
Elasticsearch 是⼀个开源的搜索引擎,建⽴在⼀个全⽂搜索引擎库Lucene基础之上。 Lucene 可
以说是当下最先进、⾼性能、全功能的搜索引擎库,缺点是Lucene的使⽤⾮常的复杂。Elasticsearch
也是使⽤ Java 编写的,它的内部使⽤ Lucene 做索引与搜索,但是它的⽬的是使全⽂检索变得简单,
通过隐藏 Lucene 的复杂性,取⽽代之的提供⼀套简单⼀致的 RESTful API。
2)相关链接
官⽹:
https://www.elastic.co/cn/downloads/elasticsearch
下载:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.1-linux-x86_64.tar.gz
分词器:
https://github.com/medcl/elasticsearch-analysis-ik
3)部署
系统环境:以下课程假设测试机器ip为172.17.0.203
解压:
tar xvf elasticsearch-7.5.1-linux-x86_64.tar.gz
许多年前,⼀个刚结婚的名叫
Shay Banon 的失业开发者,跟着他的妻⼦去了伦敦,他的妻⼦在那⾥
学习厨师。 为了给他的妻⼦做⼀个⻝谱搜索引擎,他开始使⽤
Lucene 的⼀个早期版本。直接使⽤
Lucene 是很难的,因此
Shay 开始做⼀个抽象层,Java 开发者使⽤它可以很简单的给他们的程序添加
搜索功能。 他发布了他的第⼀个开源项⽬ Compass。
后来 Shay 获得了⼀份⼯作,主要是⾼性能,分布式环境下的内存数据⽹格。这个对于⾼性能,实
时,分布式搜索引擎的需求尤为突出, 他决定重写 Compass,把它变为⼀个独⽴的服务并取名
Elasticsearch。
第⼀个公开版本在2010年2⽉发布,从此以后,Elasticsearch 已经成为了 Github 上最活跃的项
⽬之⼀,他拥有超过300名 contributors(⽬前736名 contributors )。 ⼀家公司已经开始围绕
Elasticsearch 提供商业服务,并开发新的特性,但是,Elasticsearch 将永远开源并对所有⼈可
⽤。
据说,Shay 的妻⼦还在等着她的⻝谱搜索引擎… 0_0!
修改:
confifig/elasticsearch.yml
修改⽂件描述符:
vim /etc/sysctl.conf
启动:
4)验证:
访问 http://172.17.0.203:9200 , 启动成功
#主机名,通过 hostname 命令查询到
cluster.initial_master_nodes: ["主机名"]
network.host: 0.0.0.0
http.port: 9200
http.cors.enabled
: true
http.cors.allow-origin: "*"
vm.max_map_count=64000
sysctl -p
#es不允许root⽤户启动,需要添加新⽤户身份
#创建elsearch⽤户组及elsearch⽤户
groupadd elsearch
useradd elsearch -g elsearch -p elasticsearch
#更改elasticsearch⽂件夹及内部⽂件的所属⽤户及组为elsearch:elsearch
chown -R elsearch:elsearch elasticsearch
#切换到elsearch⽤户再启动
su elsearch
#守护进程运⾏
./bin/elasticsearch -d
#验证启动进程
ps aux | grep elasticsearch
5)中⽂分词器安装:
es默认分词器对中⽂分词⾮常不友好,需要安装ik分词器
Analyzer: ik_smart , ik_max_word , Tokenizer: ik_smart , ik_max_word
6)验证分词器:
POST: http://172.17.0.203:9200/_analyze
BODY: "text":"测试分词效果","analyzer": "ik_smart"
指令:curl http://localhost:9200/_analyze -X POST -H \'Content-Type:application/json\' -d
\'"text":"test elasticsearch 测试分词效果","analyzer": "ik_smart"\'
RESULT:
"name" : "bj-yjy-java-wsw",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "LT1y6fQSRPykQv3BUdolZg",
"version" :
"number" : "7.5.1",
"build_flavor"
:
"default"
,
"build_type"
:
"tar"
,
"build_hash" : "3ae9ac9a93c95bd0cdc054951cf95d88e1e18d96",
"build_date"
: "2019-12-16T22:57:37.835892Z",
"build_snapshot" : false,
"lucene_version"
: "8.3.0",
"minimum_wire_compatibility_version"
: "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
,
"tagline" : "You Know, for Search"
wget -c https://github.com/medcl/elasticsearch-analysis
ik/releases/download/v7.5.1/elasticsearch-analysis-ik-7.5.1.zip
mkdir $ES_HOME/plugins/ik
unzip elasticsearch-analysis-ik-7.5.1.zip -d $ES_HOME/plugins/ik
#安装完成重启es
2.2.2 es-head
1)简介
我们可以⽅便的使⽤curl等客户端⼯具,通过Restful API对Elasticsearch进⾏操作,但也有⼀些客
户端⼯具提供对于ElasticSearch更加友好的可视化操作⽀持,elasticsearch-head就是其中很优秀的代
表。
"tokens": [
"token": "test",
"start_offset": 0,
"end_offset": 4,
"type": "ENGLISH",
"position": 0
,
"token"
: "elasticsearch"
,
"start_offset"
: 5,
"end_offset"
: 18,
"type"
: "ENGLISH"
,
"position": 1
,
"token": "测试",
"start_offset": 19,
"end_offset": 21,
"type": "CN_WORD",
"position": 2
,
"token": "分词",
"start_offset": 21,
"end_offset": 23,
"type": "CN_WORD",
"position": 3
,
"token": "效果",
"start_offset": 23,
"end_offset": 25,
"type": "CN_WORD",
"position": 4
]
早期版本的elasticsearch-head可以直接以插件的⽅式在Elasticsearch中进⾏安装,在
Elasticsearch 5之后则需要将elasticsearch-head服务单独运⾏,并且⽀持Chrome的插件⽅式或者
Docker容器运⾏⽅式。
2)部署
3)验证
访问9100端⼝,并连接es地址:
4)功能演示
概览:健康状态、集群信息、索引信息、分区信息
索引:索引概览、新建索引
数据浏览:索引清单、字段清单与筛选
数据查询:基本查询、复杂查询、查询基本语法
2.2.3 logstash
1)简介
Logstash诞⽣于2009年8有2⽇,其作者是世界著名的虚拟主机托管商DreamHost的运维⼯程师Jordan
Sissel。在2013年,被ElasticSearch公司收购,作为⽇志收集⼯具,成为elk的⼀员。
2)相关链接
项⽬主⻚:
#采⽤docker启动
#查看镜像
docker images |
grep elasticsearch-head
#下载镜像
docker pull alivv/elasticsearch-head
#启动
docker run -d --name eshead -p 9100:9100 alivv/elasticsearch-head
https://www.elastic.co/cn/downloads/logstash
下载地址:
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.5.1.tar.gz
3)部署
解压:
tar xvf logstash-7.5.1.tar.gz
配置:
在conf.d⽬录下新建⼀个confifig1.conf⽂件
启动,允许配置⽂件⾃动刷新:
4)验证:
input
file
path => "/root/logs/*.log"
start_position => beginning
add_field => "from" => "localfile"
filter
output
elasticsearch
hosts => "localhost:9200"
index => "mylog"
stdout
nohup sh /opt/app/elk/logstash-7.5.1/bin/logstash -f /opt/app/elk/logstash-
7.5.1/conf.d/ --config.reload.automatic >> /opt/logs/logstash.log &
2.2.4 kibana
1)简介
Kibana是⼀个开源的分析与可视化平台,主要⽤于和
Elasticsearch⼀起使⽤。使⽤kibana进⾏简单
的配置,就可以搜索、查看存放在Elasticsearch中的数据。Kibana具有各种不同的图表、表格、地图
等,借助这些直观的视图,可以达到⾼级的数据分析与可视化的⽬的。
2)相关链接
https://www.elastic.co/cn/downloads/kibana
https://artifacts.elastic.co/downloads/kibana/kibana-7.5.1-linux-x86_64.tar.gz
3)安装部署
解压:
tar xvf kibana-7.5.1-linux-x86_64.tar.gz
配置:
confifig/kibana.yml
#⽣成⼀条测试⽇志数据,从es-head验证是否正常采集
mkdir -p /root/logs/
date >> /root/logs/1.log
启动:
4)验证
启动成功,数据为空,向es提交⼀条数据,通过es-head查询,并通过logstash查询类⽐展示
下⾯logstash搭建完成后,会再次展示通过采集进⼊的数据
5)功能
索引配置
⽇志配置
检索
图表
2.2.5 kafka
1)简介
Kafka是最初由Linkedin公司开发,是⼀个分布式、分区的、多副本的、多订阅者,基于zookeeper协调
的分布式⽇志系统(也可以当做MQ系统),常⻅可以⽤于web/nginx⽇志、访问⽇志,消息服务等
等,Linkedin于2010年贡献给了Apache基⾦会并成为顶级开源项⽬。常⽤于⽇志处理场景。
2)资源
http://kafka.apache.org/downloads
3)部署
server.port: 9102
server.host: "0.0.0.0"
elasticsearch.hosts: "http://localhost:9200"
kibana.index: ".kibana"
#kibana默认不允许
root⽤户启动,可以加--allow-root选项
nohup sh /opt/app/elk/kibana-7.5.1-linux-x86_64/bin/kibana
--allow-root >
/opt/logs/kibana.log &
#docker启动
#启动zookeeper
docker run --name zookeeper \\
-v /opt/data/zksingle:/data \\
4)验证
5)实例操作
修改logstash从kafka获取,从控制台重新写⼊⼀条⽇志,进kibana查看数据展示情况
-p 2181:2181 \\
-e ZOO_LOG4J_PROP="INFO,ROLLINGFILE" \\
-d zookeeper:3.4.13
#启动kafka
docker run -d --name kafka \\
-p 9103
:9092 \\
--link zookeeper:zookeeper \\
--env
KAFKA_BROKER_ID
=100 \\
--env
HOST_IP=39.98.133.153 \\
--env
KAFKA_ZOOKEEPER_CONNECT
=zookeeper:2181 \\
--env
KAFKA_ADVERTISED_HOST_NAME
=39.98.133.153 \\
--env KAFKA_ADVERTISED_PORT=9103 \\
--restart=always \\
--volume /etc/localtime:/etc/localtime \\
wurstmeister/kafka:2.12-2.2.2
#使⽤zk节点数据验证启动情况
docker exec -it zookeeper sh
#进⼊zookeeper后查看节点信息
ls /brokers
#进⼊容器
docker exec -it kafka sh
/opt/kafka_2.12-2.2.2/bin
#客户端监听(该步会⾃动创建topic)
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic demo --
from-beginning
#另起⼀个终端,验证发送
./kafka-console-producer.sh --broker-list localhost:9092 --topic demo
input
file
path => "/root/logs/*.log"
2.2.6 kafka-manager
1)简介
kafka-manager是⽬前最受欢迎的kafka集群管理⼯具,最早由雅⻁开源,⽤户可以在Web界⾯执
⾏⼀些简单的集群管理操作。具体⽀持以下内容:
管理多个集群
轻松检查群集状态(主题,消费者,偏移,代理,副本分发,分区分发)
运⾏⾸选副本选举
使⽤选项⽣成分区分配以选择要使⽤的代理
运⾏分区重新分配(基于⽣成的分配)
使⽤可选主题配置创建主题(0.8.1.1具有与0.8.2+不同的配置)
删除主题(仅⽀持0.8.2+并记住在代理配置中设置delete.topic.enable = true)
主题列表现在指示标记为删除的主题(仅⽀持0.8.2+)
批量⽣成多个主题的分区分配,并可选择要使⽤的代理
批量运⾏重新分配多个主题的分区
将分区添加到现有主题
更新现有主题的配置
2)资源
start_position => beginning
add_field => "from" => "localfile"
kafka
bootstrap_servers => ["39.98.133.153:9103"]
group_id => "logstash"
topics => ["demo"]
consumer_threads
=>
1
decorate_events
=>
true
add_field
=> "from" => "demo"
filter
output
elasticsearch
hosts => "localhost:9200"
index => "mylog"
stdout
https://github.com/yahoo/kafka-manager/releases
docker库⾥的版本太陈旧,需要从官⽹下载源码包,编译成⼆进制包。具体编译过程参考项⽬主⻚
下⾯的Deployment章节。
部署中直接使⽤打好包的kafka-manager-2.0.0.2.zip,manage版本为2.0.0.2,配置kafka cluster
最⾼⽀持2.2.0 ,实际验证,可以操作kafka 2.2.2
3)部署
4)功能说明
cluster创建与管理
Brokers信息查看
topic创建与管理
pattern及replica配置
2.2.7 fifilebeat
1)简介
Filebeat是⼀个轻量级⽇志传输Agent,可以将指定⽇志转发到Logstash、Elasticsearch、Kafka、
Redis等中。Filebeat占⽤资源少,⽽且安装配置也⽐较简单,⽀持⽬前各类主流OS及Docker平台。
#解压
unzip kafka-manager-2.0.0.2.zip
#配置⽂件,修改⽬录下的conf/application.conf
kafka-manager.zkhosts="localhost:2181"
#启动,指定端⼝9104
km_home=./kafka-manager-2.0.0.2
nohup $km_home/bin/kafka-manager -Dconfig.file=$km_home/conf/application.conf -
Dhttp.port=9104 > /opt/logs/kibana.log &
tail -f /opt/logs/kibana.log
2)资源
主⻚:
https://www.elastic.co/cn/products/beats/fifilebeat
下载:
wget https://artifacts.elastic.co/downloads/beats/fifilebeat/fifilebeat-7.5.1-linux-x86_64.tar.gz
3)部署
解压:tar zxvf fifilebeat-7.5.1-linux-x86_64.tar.gz
使⽤kafka-manager创建⼀个fifilebeat队列
配置fifilebeat.yml:
filebeat.inputs:
- type: log
enabled: true
paths:
- /root/logs/*.log
fields:
from: filebeat启动:
4)验证
修改logstash,去掉fifile采集,接收来⾃fifilebeat队列的消息。
请注意!这⾥有⼀个问题:fifilebeat默认读取字符后,输出的是json格式,上述codec即让logstash解析
json,但是仍会报错。原因是fifilebeat⾥的host.name属性,需要加⼊fifilter,合并属性名字:
output.kafka:
enabled: true
hosts: ["39.98.133.153:9103"]
topic: filebeat
compression: gzip
processors:
- drop_fields:
fields: ["beat"
, "input", "source",
"offset","metadata"
,"timestamp","agent","ecs","fields"]
filebeat.config.modules
:
path: $path.config/modules.d/*.yml
reload.enabled: true
logging.level: info
name: filebeat-server-ip
cd /opt/app/elk/filebeat-7.5.1-linux-x86_64
nohup ./filebeat -e -c filebeat.yml >> /opt/logs/filebeat.log &
tail -f /opt/logs/filebeat.log
input
kafka
bootstrap_servers => ["39.98.133.153:9103"]
group_id => "logstash"
topics => ["filebeat"]
consumer_threads => 1
decorate_events => true
add_field => "from" => "filebeat"
codec => "json"
...
filter
mutate
rename => "[host][name]" => "host"
重新录⼊⼀条⽇志信息仅log⽂件,查看logstash stdout⽇志,查看kibana是否正常采集⼊es
附:fifilebeat输出json格式参考范本
附:简单⽂本处理命令参考
"@timestamp"
: "2019-05-11T07:55:02.127Z",
"@metadata"
:
"beat"
:
"filebeat"
,
"type"
:
"_doc",
"version": "7.5.1",
"topic": "app.log"
,
"ecs":
"version": "1.0.0"
,
"log":
"offset": 2661796,
"file":
"path": "/var/log/app.log"
,
"message": "05-11 00:10:19.851[DEBUG][http-nio-39545-exec-9] ",
"fields":
"log_topic": "app.log"
,
"host":
"name": "172.33.12.109"
,
"agent":
"id": "6a86e9d9-e1e8-4b32-b027-f1c936f66e4f",
"version": "7.0.1",
"name": "172.33.12.109",
"type": "filebeat",
"ephemeral_id": "8326a240-e9de-44f4-b24d-a1c8d2654e19",
"hostname": "client-ali"
#列出根下的⽬录
ls -l
lrwxrwxrwx. 1 root root 7 Dec 17 09:20 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Dec 24 18:33 boot
drwxr-xr-x 21 root root 3140 Dec 31 10:39 dev
drwxr-xr-x. 84 root root 8192 Jan 3 10:09 etc
drwxr-xr-x. 3 root root 22 Jan 3 09:38 home
lrwxrwxrwx. 1 root root 7 Dec 17 09:20 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Dec 17 09:20 lib64 -> usr/lib64
...
#使⽤grep过滤lib
开头,并且不要带
64的
ll | grep lib |
grep -v 64
lrwxrwxrwx.
1 root root 7 Dec 17 09:20 lib -> usr/lib
#使⽤awk摘取⽬录名称
ll | grep lib | grep -v 64 | awk \'print $9\'
lib
#awk可以⾃定分隔符,⽤-F
echo \'123#456\'
echo \'123#456\' | awk -F \'#\' \'print $2\'