ELK 学习与部署

使用ELK收集分析物理设备的日志,确保硬件正常,是否可行?

基本概念理解

syslog-ng:一种日志服务软件 ,与系统自带的syslog类似,配置较为简单。
logstash :日志传输工具,像管道一样接受input,输出output,之间可以过滤。iuput支持多种类型:文件、stdin、syslog、tcp。output支持输出到elasticsearch,email,file,nagios,stdout tcp hdfs.

Logstash 不只是一个input | filter | output 的数据流,而是一个 input | decode | filter | encode | output 的数据流!codec 就是用来 decode、encode 事件的。

elasticsearch:是一个分布式全文搜索引擎,负责存储logstash传递过来的日志。
kibana:可视化web框架,与grafana类似。获取后端数据,在web端可视化。
Beats:从packetbeat发展出来的数据收集系统,beat收集器可以直接写入elsaticsearch,也可以传输给logstash。

先玩logstash,再玩elasticsearch,再用kibana。数据收集需要用大beats时再说。

部署测试

测试学习时使用tar.gz文件,解压后手动指定配置文件运行。生产环境使用对应操作系统已编译好的二进制安装包。因为安装包会创建合适的用户和服务启动脚本。

各个组件部署和测试

操作系统:centos7.5,安装2台,便于测试elasticsearch集群功能。配置4C8G100G。
1 下载包并解压包

1
2
3
4
5
6
7
8
#安装jdk
yum install java-1.8.0-openjdk.x86_64
cd ~
mkdir ELK && cd ELK
wget https://artifacts.elastic.co/downloads/logstash/logstash-oss-6.3.1.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-oss-6.3.1.tar.gz
wget https://artifacts.elastic.co/downloads/kibana/kibana-oss-6.3.1-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-oss-6.3.1-linux-x86_64.tar.gz

2 运行logstash
logstash的作用为收集、过滤编码、传输数据。

1
2
3
4
 
#在命令行输入配置文件,使用标准输入作为logstash输入,标准输出作为logstash输出。
cd logstash-6.3.1
bin/logstash -e 'input { stdin { } } output { stdout {} }'

启动成功后输入任意字符,会返回json格式的日志。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost logstash-6.3.1]# bin/logstash -e 'input { stdin { } } output { stdout {} }'
Sending Logstash's logs to /root/ELK/logstash-6.3.1/logs which is now configured via log4j2.properties
[2018-07-13T11:42:29,065][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2018-07-13T11:42:29,811][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"6.3.1"}
[2018-07-13T11:42:32,193][INFO ][logstash.pipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
The stdin plugin is now waiting for input:
[2018-07-13T11:42:32,400][INFO ][logstash.pipeline ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#<Thread:0x709764de run>"}
[2018-07-13T11:42:32,472][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2018-07-13T11:42:32,710][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
hello world
{
"message" => "hello world",
"@version" => "1",
"@timestamp" => 2018-07-13T03:42:43.934Z,
"host" => "localhost.localdomain"
}

一般情况是使用beats收集主机的日志后,再传输到logstash,logstash再传输到elasticsearch.也可以直接使用logstash收集日志,传递到elasticstash。
logstash 监视日志并传输到控制台配置文件。先把示例日志下载下来

1
2
3
4
wget https://download.elastic.co/demos/logstash/gettingstarted/logstash-tutorial.log.gz
[root@localhost logstash-6.3.1]# gunzip logstash-tutorial.log.gz
[root@localhost logstash-6.3.1]# cat logstash-tutorial.log | wc -l
100

logstash配置文件 first-logstash.yml

1
2
3
4
5
6
7
8
9
input {
file {
path => "/root/ELK/logstash-6.3.1/*.log"
}
}

output {
stdout { codec => json }
}

使用配置文件运行logstash bin/logstash -f config/first-logstash.conf --config.reload.automatic
会在控制台显示日志内容。将output改为elasticsearch,即可将日志输出到那边。
使用filter将非结构化的日志转为格式化。

1
2
3
4
5
6
7
8
9
10
11
 filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}

output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}

3 运行elasticsearch
elasticsearch常用api

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 确认基本信息
curl http://127.0.0.1:9200/
# 集群健康检查
curl GET http://127.0.0.1:9200/_cat/health?v
# 节点查看
curl GET http://127.0.0.1:9200/_cat/nodes?v
# 查看索引
curl GET http://127.0.0.1:9200/_cat/indices?v
# 创建索引
curl -X PUT http://127.0.0.1:9200/customer?pretty
# 给索引中添加记录,修改记录在指定的ID位置,传入新值即可。
curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'{ "name": "John Doe"}'
# 更新记录也可以用update
curl -X POST "localhost:9200/customer/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d'{ "doc": { "name": "Jane Doe", "age": 20 }}'
# 查询记录
curl GET http://127.0.0.1:9200/customer/_doc/1?pretty
# 删除记录
curl -X DELETE "localhost:9200/customer/_doc/2?pretty"
# 删除索引
curl -X DELETE "localhost:9200/customer?pretty"
# 批量操作用_bulk
POST /customer/_doc/_bulk?pretty

索引:数据表的一种名称。在elasticsearch中的数据,一个索引会分为5片并保留一个副本。分5片可提高查询速度。
4 运行kibana

参考链接

http://www.cnblogs.com/hanyifeng/p/5509985.html
https://legacy.gitbook.com/book/chenryn/elk-stack-guide-cn/details
https://operational.io/elk-for-network-operations/
https://www.elastic.co/cn/
https://blog.csdn.net/thinkmore1314/article/details/9469499