一、ELK简介
ELK就是一款非常优秀的、开源的、用于搭建实时日志分析平台的组件。ELK是Elasticsearch、Logstash和Kiabana这3款开源框架首字母的缩写。通过这三个组件,构建一个统一的日志管理系统,用来收集分布式部署系统中分散在不同设备上的日志,方便后续进行日志分析。
其中,Elasticsearch是一个实时的分布式搜索和分析引擎,建立在全文搜索引擎Apache Lucene基础之上,使用Java语言编写,具有分布式、高可用性、易扩展、具有副本和索引自动分片功能、提供基于HTTP协议以JSON为数据交互格式的REST风格API、多数据源、实时分析存储等特点。
Logstach主要用于对日志进行收集、过滤,对数据进行格式化处理,并将所收集的日志传输到相关系统进行存储。Logstash是用Ruby语言开发的,由数据输入端、过滤器和数据输出端3部分组成。其中数据输入端可以从数据源采集数据,过滤器是数据处理层,包括对数据进行格式化处理、数据类型转换、数据过滤等,支持正则表达式;数据输出端是将Logstash收集的数据经由过滤器处理后输出到其他系统,Kafka、HDFS、Elasticsearch等。
Kibana是一款针对Elasticsearch开源分析及可视化平台,使用node.js开发,可用来搜索,展示存储在Elasticsearch中的数据。同时提供了丰富的图表模板,只需通过简单的配置就可以方便地进行高级数据分析和绘制各种图表。
其实,在实际的ELK系统中,还需要配置一个日志收集器,比如FileBeats等。安装在每台需要收集日志的服务器上,将日志发送给Logstash进行处理,所以Beats是一个“搬运工”,将你的日志搬运到日志收集服务器上。
二、需要环境
1、关闭防火墙(生产环境开放对应端口即可)
2、JDK环境
三、Elasticsearch安装
1、下载Elasticsearch,这里选择Elasticsearch7.9.3这个版本,命令如下:
当前目录 /home/admin/work/elk/es
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.tar.gz
如果虚拟机下载较慢,可以把url放在浏览器下载,再传送到虚拟机;
2、解压
tar -zvxf elasticsearch-6.3.1.tar.gz
3、修改配置文件
cluster.name: elk
node.name: node-1
node.master: true
node.data: true
node.ingest: false
network.host: 0.0.0.0
http.port: 9203
discovery.seed_hosts: ["127.0.0.1:9203"]
cluster.initial_master_nodes: ["node-1"]
3、创建启动elasticsearch的用户(elasticsearch不能够使用root用户启动)
当前已经是普通用户,略。
4.启动elasticsearch
#当前所在目录 /home/admin/work/elk/es/elasticsearch/bin
./elasticsearch &
5、验证
访问http://192.168.180.133:9203/,出现如下界面,说明启动成功。
四、Kibana 安装
1、下载Kibana ,这里选择kibana7.9.3这个版本(和elasticsearch同步),命令如下:
#当前目录:/home/admin/work/elk/kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.9.3-linux-x86_64.tar.gz
版本和es保持一致;
2、解压
tar -zvxf kibana-7.9.3-linux-x86_64.tar.gz
修改配置文件
修改配置文件/home/admin/work/elk/kibana/kibana-7.9.3-linux-x86_64/config/kibana.yml文件,添加如下配置即可:
server.port: 5601
server.host: "192.168.180.133"
elasticsearch.hosts: ["http://192.168.180.133:9203"]
4、启动
#当前目录/home/admin/work/elk/kibana/kibana-7.9.3-linux-x86_64/bin
./kibana
5、验证
访问http://192.168.180.133:5601,出现如下界面,说明成功。
五、Logstash 安装
1、下载Logstash ,这里选择Logstash7.9.3 这个版本(和elasticsearch同步),命令如下:
#当前目录:/home/admin/work/elk/logstash
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.9.3.tar.gz
2、解压
tar -zxvf logstash-6.3.1.tar.gz
3、修改配置文件
修改配置文件/home/admin/work/elk/logstash/logstash-7.9.3/config/logstash.yml文件,添加如下配置即可:
http.host: 192.168.180.133
http.port: 9600
4、验证
在/home/admin/work/elk/logstash/logstash-7.9.3/bin目录下,通过执行bin/logstash -e ‘input { stdin { } } output { stdout {} }’,然后在输入hello,出现如下界面说明,logstash可以正常使用。
[admin@localhost bin]$ ./logstash -e 'input { stdin { } } output { stdout {} }'
Sending Logstash logs to /home/admin/work/elk/logstash/logstash-7.9.3/logs which is now configured via log4j2.properties
[2021-08-14T02:16:19,631][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"7.9.3", "jruby.version"=>"jruby 9.2.13.0 (2.5.7) 2020-08-03 9a89c94bcc OpenJDK 64-Bit Server VM 25.161-b14 on 1.8.0_161-b14 +indy +jit [linux-x86_64]"}
[2021-08-14T02:16:20,140][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/home/admin/work/elk/logstash/logstash-7.9.3/data/queue"}
[2021-08-14T02:16:20,186][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/home/admin/work/elk/logstash/logstash-7.9.3/data/dead_letter_queue"}
[2021-08-14T02:16:22,292][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2021-08-14T02:16:22,396][INFO ][logstash.agent ] No persistent UUID file found. Generating new UUID {:uuid=>"0c8b031f-9f95-4a2d-ae03-af2027fdb11d", :path=>"/home/admin/work/elk/logstash/logstash-7.9.3/data/uuid"}
[2021-08-14T02:16:28,310][INFO ][org.reflections.Reflections] Reflections took 154 ms to scan 1 urls, producing 22 keys and 45 values
[2021-08-14T02:16:37,363][INFO ][logstash.javapipeline ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>250, "pipeline.sources"=>["config string"], :thread=>"#"}
[2021-08-14T02:16:41,789][INFO ][logstash.javapipeline ][main] Pipeline Java execution initialization time {"seconds"=>4.39}
[2021-08-14T02:16:42,331][INFO ][logstash.javapipeline ][main] Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[2021-08-14T02:16:42,862][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
"message" => "",
"@version" => "1",
"@timestamp" => 2021-08-14T06:16:42.618Z,
"host" => "localhost.localdomain"
}
六、Filebeat安装
注意:Filebeat要安装在产生日志的主机,并且每个产生日志的机器都要安装Filebeat。
1、下载
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.9.3-linux-x86_64.tar.gz
2、解压
tar -zvxf filebeat-7.9.3-linux-x86_64.tar.gz
3.修改配置文件
修改/home/admin/work/elk/fileBeat/filebeat-7.9.3-linux-x86_64配置文件,添加如下内容:
filebeat.inputs:
enabled: true
paths:
- /home/admin/work/temp/info.log #日志存放目录
output.logstash:
# The Logstash hosts
hosts: ["192.168.1.8:5044"]
默认开启了Elasticsearch的输出,需要注释掉。
4、启动filebeat
./filebeat -e -c filebeat.yml
后台启动:
1>、nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 & 将所有标准输出及标准错误输出到/dev/null空设- 备,即没有任何输出
2>、nohup ./filebeat -e -c filebeat.yml > filebeat.log &
七、示例
通过上述步骤,已经完成了四个组件的安装工作,下面来实现读取nginx访问日志,并写入到ES中的例子
1、配置logstash采集处理日志的配置
input {//输入源为Beats
beats {
port => 5044
type => "nginx_access_log"
}
}
filter {
if [type] == "nginx" { # 这里的type是日志类型
grok {
match => { "message" => "%{COMBINEDAPACHELOG} %{QS:gzip_ratio}" } # 使用自带的pattern即可,注意空格
}
# 更改匹配到的字段的数据类型
mutate {
convert => ["response", "integer"]
convert => ["bytes", "integer"]
convert => ["responsetime", "float"]
}
# 指定时间戳字段以及具体的格式
date {
match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z"]
remove_field => ["timestamp"]
}
}
}
output {#配置elasticsearch作为输出目的地
elasticsearch {
hosts => [ "192.168.1.8:9200" ]
index => "%{type}-%{+YYYY.MM.dd}" # index中含有时间戳
}
}
2.启动logstash
./logstash -f job/nginx.conf
3、配置ES的Index的Mapping信息
通过执行如下命令即可。
curl -H "Content-Type: application/json" -XPUT 192.168.1.8:9200/_template/nginx -d '
{
"template": "nginx*",
"mappings": {
"_default_": {
"properties": {
"clientip": {
"type": "keyword"
},
"ident": {
"type": "keyword"
},
"auth": {
"type": "keyword"
},
"verb": {
"type": "keyword"
},
"request": {
"type": "keyword"
},
"httpversion": {
"type": "keyword"
},
"rawrequest": {
"type": "keyword"
},
"response": {
"type": "keyword"
},
"bytes": {
"type": "integer"
},
"referrer": {
"type": "keyword"
},
"agent": {
"type": "keyword"
},
"gzip_ratio": {
"type": "keyword"
}
}
}
}
}'
4.用Kibana查看Elasticsearch索引数据
(1)通过访问【http://192.168.1.8:5601】打开Kibana界面,找到Management菜单,如下图所示:
(2)创建索引的匹配规则(正则表达式),点击下一步
(3)创建索引,选择“I don’t want to use the Time Filter”,然后点击创建按钮。
(4)点击Disconer菜单,这个时候,就可以看到了nginx访问日志中数据了,如下所示。
五、遇到的问题
1.启动Kibana 报错
log [05:15:13.444] [warning][savedobjects-service] Unable to connect to Elasticsearch. Error: [master_not_discovered_exception] null
原因是elasticsearch启动后,没有选举出master。因为我们部署的es是单机,所以没办法选举。
在ES添加如下配置即可
#该node默认成为master
cluster.initial_master_nodes: ["node-1"]
参考:
https://blog.csdn.net/hou_ge/article/details/106175074
https://blog.csdn.net/hou_ge/article/details/106182502