ELK 是 ElasticSearch、 LogStash、 Kibana 三个开源工具的简称,现在还包括 Beats,其分工如下:
基于 ELK Stack 可以构建日志分析平台、数据分析搜索平台等非常有用的项目。
简单介绍下 ELK 各个软件的安装与简单配置,快速的搭建一个日志的查询平台
ES 是一个基于 Lucene 的使用 Java 开发的开源搜索引擎,因此其运行是基于 JVM 的,因此在安装之前需要保证已经安装了 Java 环境。ES 要求使用 Java8 或者更高版本的 Java 环境。
1、安装JDK
下载JDK:https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html
本环境下载的是64位tar.gz包,将安装包拷贝至安装服务器/usr/java目录
[root@izbp14hdjlwscja93xb3ovz java]# tar -zxvf jdk-8u181-linux-x64.tar.gz
配置环境变量
[root@izbp14hdjlwscja93xb3ovz java]# vim /etc/profile
将下面的内容添加至文件末尾(假如服务器需要多个JDK版本,为了ELK不影响其它系统,也可以将环境变量的内容稍后添加到ELK的启动脚本中)
#set java enviroment
export JAVA_HOME=/usr/java/jdk/jdk1.8.0_131
export JRE_HOME=/usr/java/jdk/jdk1.8.0_131/jre
export CLASSPATH=.:$JAVA_HOME/lib$:JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin/$JAVA_HOME:$PATH
保存后运行source /etc/profile使环境变量生效
2、 ElasticSearch 的安装
1)创建运行ELK的用户:
[root@izbp14hdjlwscja93xb3ovz java]# groupadd dukun
[root@izbp14hdjlwscja93xb3ovz java]# useradd -g dukun dukun
设置用户密码:passwd dukun
2)创建ELK运行目录:
[root@izbp14hdjlwscja93xb3ovz elk]# mkdir es
给用户赋权
[root@izbp14hdjlwscja93xb3ovz home]# chown -R dukun:dukun elk/
以上全部是root用户完成
3)配置启动ElasticSearch
切换到dukun用户:[root@izbp14hdjlwscja93xb3ovz home]# su dukun
解压文件夹
[dukun@izbp14hdjlwscja93xb3ovz es]$ tar -zxvf elasticsearch-6.4.2.tar.gz
修改配置文件
进入/home/elk/es/elasticsearch-6.4.2/config
elasticsearch配置文件在这两个地方,有两个配置文件:
[root@izbp14hdjlwscja93xb3ovz config]# vim elasticsearch.yml
[root@izbp14hdjlwscja93xb3ovz config]# vim jvm.options 可以根据自己需求修改大小
4)启动
进入bin下启动
[dukun@izbp14hdjlwscja93xb3ovz bin]$ ./elasticsearch
5)启动遇到的问题
如果使用root用户启动会出现如下:这个时候我们就要用我们上面创建的用户启动
问题二:ERROR: bootstrap checks failed
max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
max number of threads [1024] for user [lishang] likely too low, increase to at least [2048]
解决:切换到root用户,编辑limits.conf 添加类似如下内容
vi /etc/security/limits.conf
添加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
问题三:max number of threads [1024] for user [lish] likely too low, increase to at least [2048]
解决:切换到root用户,进入limits.d目录下修改配置文件。
vi /etc/security/limits.d/90-nproc.conf
修改如下内容:
* soft nproc 1024
#修改为
* soft nproc 2048
问题四:max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
解决:切换到root用户修改配置sysctl.conf
vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360
并执行命令:
sysctl -p
问题五:max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
解决:修改切换到root用户修改配置limits.conf 添加下面两行
命令:vi /etc/security/limits.conf
* hard nofile 65536
* soft nofile 65536
切换到es的用户。
然后,重新启动elasticsearch,即可启动成功。
检查elasticsearch状态,如下则表示正常运行
[root@elk-server elasticsearch]# curl http://10.17.83.42:9200
{
"name" : "6eN59Pf",
"cluster_name" : "my-application",
"cluster_uuid" : "cKopwE1iTciIQAiFI6d8Gw",
"version" : {
"number" : "5.5.2",
"build_hash" : "b2f0c09",
"build_date" : "2017-08-14T12:33:14.154Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
logstash是ELK中负责收集和过滤日志的
logstash的配置文件须包含三个内容:
input{}:此模块是负责收集日志,可以从文件读取、从redis读取或者开启端口让产生日志的业务系统直接写入到logstash
filter{}:此模块是负责过滤收集到的日志,并根据过滤后对日志定义显示字段
output{}:此模块是负责将过滤后的日志输出到elasticsearch或者文件、redis等
1、下载
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.2.tar.gz
2、解压
tar -zxvf logstash-6.4.2.tar.gz
3、修改文件
im config/logstash-es.conf
#注意要设置编码格式,防止中文乱码
input {
beats {
port => 5044
codec => json{ charset => "UTF-8" }
}
}
output {
elasticsearch {
hosts => ["http://192.168.200.201:9201","http://192.168.200.202:9201","http://192.168.200.203:9201"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
如果处理两套业务系统的日志
type:代表类型,其实就是将这个类型推送到Elasticsearch,方便后面的kibana进行分类搜索,一般直接命名业务系统的项目名
path:读取文件的路径
这个是代表日志报错时,将报错的换行归属于上一条message内容
start_position => "beginning"是代表从文件头部开始读取
filter{}中的grok是采用正则表达式来过滤日志,其中%{TIMESTAMP_ISO8601}代表一个内置获取2016-11-05 00:00:03,731时间的正则表达式的函数,%{TIMESTAMP_ISO8601:date1}代表将获取的值赋给date1,在kibana中可以体现出来
本环境有两条grok是代表,第一条不符合将执行第二条
其中index是定义将过滤后的日志推送到Elasticsearch后存储的名字
%{type}是调用input中的type变量(函数)
4.启动服务
#控制台启动,且输出日志
bin/logstash -f logstash-es.conf
#后台启动
bin/logstash -f config/logstash-es.conf &
# ./bin/logstash -e 'input { stdin { } } output { stdout {} }'
输入”hello world! ”,验证是否正常输出
[root@izbp14hdjlwscja93xb3ovz logstash-6.4.2]# ./bin/logstash -e 'input { stdin { } } output { stdout {} }'
Sending Logstash logs to /home/elk/logstash/logstash-6.4.2/logs which is now configured via log4j2.properties
[2018-10-11T13:19:38,141][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2018-10-11T13:19:38,901][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"6.4.2"}
[2018-10-11T13:19:40,919][INFO ][logstash.pipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
The stdin plugin is now waiting for input:
[2018-10-11T13:19:41,075][INFO ][logstash.pipeline ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#"}
[2018-10-11T13:19:41,132][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2018-10-11T13:19:41,321][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
hello word
{
"@timestamp" => 2018-10-11T05:21:47.230Z,
"@version" => "1",
"host" => "izbp14hdjlwscja93xb3ovz",
"message" => "hello word"
}
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.2-linux-x86_64.tar.gz
2、解压至安装目录
# tar -zxf kibana-5.5.2-linux-x86_64.tar.gz -C /usr/local/
# cd /usr/local/
# mv kibana-5.5.2-linux-x86_64 kibana
3、修改配置
# cd kibana/
# vim config/kibana.yml
server.port: 5601 # 监听端口
server.host: "10.17.83.42" # 指定后端服务器
elasticsearch.url: "http://172.16.131.11:9200" # 指定elasticsearch实例地址
ss