公司需求,要求搭建一套ELK环境,便搜索了一些资料,把整个搭建过程记录下来,以便未来进行翻阅。
ELKF分别是ElasticSearch,Logstash,Kibana和Filebeat:
- ElasticSearch大家可以理解为一个搜索引擎
- Logstash是分析日志过滤日志的工具,也可以收集日志,不过本环境不用
- Kibana负责前台页面展示
- Filebeat主要负责日志的收集,相对于Logstash来说,比较轻量化,推荐使用
本次搭建过程,所有软件包用的均是6.2.2版本,大家可以到官网自行下载https://www.elastic.co/cn/,所需软件包如下:
elasticsearch-6.2.4.tar.gz
filebeat-6.2.4-linux-x86_64.tar.gz
kibana-6.2.4-linux-x86_64.tar.gz
logstash-6.2.4.tar.gz
jdk-8u91-linux-x64.tar.gz
一、JDK安装
如果系统环境没有安装JDK的话,需要先安装JDK,如果系统环境已经安装了的话,请跳过本步骤
将压缩包解压到/usr/java/目录下,没有该目录,请自行创建,解压后修改/etc/profile
vim /etc/profile
#在文件末尾添加:
export JAVA_HOME=/usr/java
export JRE_HOME=/usr/java/jre
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=./:$JAVA_HOME/lib:$JRE_HOME/lib
#保存退出后,执行
source /etc/profile
#验证安装结果
java -version
#结果如下,表示安装成功
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
二、ElasticSearch安装
修改文件句柄数量,将max file descriptors调整到至少65536,否则将会报错,报错内容如下:
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
修改,在文件末尾添加:
vim /etc/security/limits.conf
elk soft nofile 819200
elk hard nofile 819200
修改虚拟内存,将max virtual memory areas vm.max_map_count调整到至少262144,否则将会报错,报错内容如下:
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
修改,在文件末尾添加:
vim /etc/sysctl.conf
vm.max_map_count=655360
保存退出后执行:
sysctl -p
创建elk用户,本次实验中ELK组建都是在elk用户下进行安装,ElasticSearch不能在root下操作,否则会报错,报错内容如下:
don't run elasticsearch as root
创建用户:
useradd elk -d /home/elk
将所有的软件包都放到elk用户的宿主目录,也就是/home/elk目录下,然后进行安装:
更改软件包权限,并切换到elk用户,将压缩包解压:
chown elk.elk /home/elk/*
su -
tar zxvf elasticsearch-6.2.4.tar.gz
更改配置文件:
cd elasticsearch-6.2.4
vim config/elasticsearch.yml
cluster.name: es_cluster
node.name: node-0
path.data: /home/elk/data
path.logs: /home/elk/logs
network.host: ES机器IP #这里使用的内网ip
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
保存退出后,安装X-Pack:
./bin/elasticsearch-plugin install x-pack
运行ElasticSearch:
./bin/elasticsearch -d #加-d是后台运行,不加是前台运行
手动输入生成密码,生成的elastic、kibana、logstash-system三个用户和密码,记下来备用:
./bin/x-pack/setup-passwords interactive
三、Kibana安装
解压软件包:
tar zxvf kibana-6.2.4-linux-x86_64.tar.gz
安装Xpack:
cd kibana-6.2.4-linux-x86_64
bin/kibana-plugin install x-pack
修改配置文件:
vim config/kibana.yml
server.port: 5601
server.host: “kibana机器IP” #这里填写的是内网ip
elasticsearch.url: http://ES机器IP:9200
elasticsearch.username: "kibana"
elasticsearch.password: "kibana password" #安装ES的X-Pack时生成的密码
kibana.index: “.kibana”
保存退出后启动Kibana:
nohup ./bin/kibana & #后台启动,直接运行./bin/kibana是前台启动
访问http://kibana机器IP:5601,使用用户elastic及其密码即可登录,这个elastic用户的密码是在安装ES的X-Pack时生成的
四、Logstash安装
解压软件包:
tar zxvf logstash-6.2.4.tar.gz
安装Xpack:
cd logstash-6.2.4
./bin/logstash-plugin install x-pack
创建模版:
curl --user elastic:elastic用户密码 -XPUT \
http://localhost:9200/_template/stephen.logs.template \
-H 'Content-Type: application/json' \
-d '{
"index_patterns": [
"stephen.logs-*"
],
"settings": {
"index": {
"refresh_interval": "5s"
}
},
"mappings": {
"_default_": {
"dynamic_templates": [
{
"string_fields": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "text",
"norms": false
}
}
}
],
"properties": {
"@timestamp": {
"type": "date"
},
"@version": {
"type": "keyword"
},
"geoip": {
"dynamic": true,
"properties": {
"ip": {
"type": "ip"
},
"location": {
"type": "geo_point"
},
"latitude": {
"type": "half_float"
},
"longitude": {
"type": "half_float"
}
}
}
}
}
},
"aliases": {}
}'
url中_template后为模板名,可自由指定,body中index_patterns为需要匹配的索引名,可以指定多项,可以使用通配符。本篇中,日志均使用索引stephen.logs-*
为了使logstash可以正常的创建index、上传日志,按照logstash的文档,需要在elastic中创建两组角色用户
curl --user elastic:elastic用户密码 -X POST \
http://localhost:9200/_xpack/security/role/logstash_writer \
-H 'Content-Type: application/json' \
-d '{
"cluster": ["manage_index_templates", "monitor"],
"indices": [
{
"names": [ "stephen.logs-*" ],
"privileges": ["write","delete","create_index"]
}
]
}'
生成logstash_internal用户密码,记录下来留作备用:
curl --user elastic:elastic用户密码 -X POST \
http://localhost:9200/_xpack/security/user/logstash_internal \
-H 'Content-Type: application/json' \
-d '{
"password" : "logstash_internal password",
"roles" : [ "logstash_writer" ],
"full_name" : "Internal Logstash User"
}'
curl --user elastic:elastic用户密码 -X POST \
http://localhost:9200/_xpack/security/role/logstash_reader \
-H 'Content-Type: application/json' \
-d '{
"indices": [
{
"names": [ "stephen.logs-*" ],
"privileges": ["read","view_index_metadata"]
}
]
}'
生成logstash_user的密码,记下来备用:
curl --user elastic:elastic用户密码 -X POST \
http://localhost:9200/_xpack/security/user/logstash_user \
-H 'Content-Type: application/json' \
-d '{
"password" : "logstash_user password",
"roles" : [ "logstash_reader", "logstash_admin"],
"full_name" : "Kibana User for Logstash"
}'
修改配置文件:
vim ./config/logstash.yml
# 打开/关闭monitor功能
xpack.monitoring.enabled: "true"
# ES地址
xpack.monitoring.elasticsearch.url: "http://ES设定的内网IP:9200"
# logstash_system用户的密码就是安装ES的X-Pack时生成的
xpack.monitoring.elasticsearch.username: "logstash_system"
xpack.monitoring.elasticsearch.password: "logstash system password"
创建并修改配置文件./config/logstash.conf
input {
beats {
port => 5044
}
}
filter {
if [fields][document_type] == "serverLog" {
grok {
patterns_dir => ["./patterns"]
match => { "message" => "%{TIMESTAMP_ISO8601:time}\s*\[%{THREAD_NAME:thread_name}\]\s+%{LOGLEVEL:level}\s*%{CLASS:class}\s*\-\s*%{TRACE_ID:trace_id}\s*%{CONTENT:content}" }
}
}
if [fields][document_type] == "GsLog" {
grok {
patterns_dir => ["./patterns"]
match => { "message" => "%{LOGLEVEL:level}\s+%{TIMESTAMP_ISO8601:time}\s+\[%{THREAD_NAME:tread_name}\]\s+%{CLASS:class}\s+-\s+%{CONTENT:content}" }
}
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => ["ES的IP:9200"]
user => "logstash_internal"
password => "logstash_internal用户的密码"
index => "stephen.logs-%{+YYYY.MM.dd}"
manage_template => false
template_name => "stephen.logs.template"
}
}
input为输入模块,此处指定了接收filebeat的端口号
filter为过滤模块,这里我使用的是grok插件
patterns_dir指定的是我自定义pattern文件的位置,用于进行match匹配,grok本身自带了很多patterns,详情请看https://github.com/logstash-p...
如果你想自定义一些正则表达式,建议使用grok debugger进行调试:http://grok.qiexun.net/
这里的match说白了就是正则表达式匹配,例如:
%{TIMESTAMP_ISO8601:time}\s*\[%{THREAD_NAME:thread_name}\]\s+%{LOGLEVEL:level}\s*%{CLASS:class}\s*\-\s*%{TRACE_ID:trace_id}\s*%{CONTENT:content}
#将这一长串代码拆开来看就会直观很多,中间的\s是空格的意思
%{TIMESTAMP_ISO8601:time}
%{THREAD_NAME:thread_name}
%{LOGLEVEL:level}
%{CLASS:class}
%{TRACE_ID:trace_id}
%{CONTENT:content}
#这里,TIMESTAMP_ISO8601相当于一个变量,可以在自定义pattern文件中指定,也可以使用grok自带的
#time是你给前面变量定义的别名,定义好以后会在kibana中看到,不定义的话在kibana中看不到
以下为我自定义pattern grok debugger的调试过程:
如果想要深入学习的可以参考,建议直接看官方网址的英文原版,所有的插件语法规则都可以在官网上查看:
https://doc.yonyoucloud.com/d...
https://www.elastic.co/guide/...
output为输出模块,这里使用elasticsearch将日志输出到ElasticSearch。这里需要注意的是,index为logstash创建index的规则,这里每天创建一个index,以日期结尾;templat_name为之前创建的模板名
运行以下检测配置文件是否正确:
./bin/logstash -f config/logstash.conf --config.test_and_exit
启动logstash:
#后台运行
nohup bin/logstash -f config/logstash.conf &
#前台运行
./bin/logstash -f config/logstash.conf
五、Filebeat安装
将filebeat-6.2.4-linux-x86_64.tar.gz上传到要收集日志的服务器的/usr/local文件夹下,解压:
cd /usr/local
tar zxvf filebeat-6.2.4-linux-x86_64.tar.gz
配置,主要修改以下几个点:
filebeat.prospectors:
- type: log
enabled: true
paths:
- /logs1/1.log
- /logs2/*.log
fields:
document_type: serverLog
- type: log
enabled: true
paths:
- /logs/gs.log
fields:
document_type: GsLog
output.logstash:
# The Logstash hosts
hosts: ["Logstash的ip:5044"]
上面的document_type是为了在logstash中写过滤规则用的,对不同的日志进行不同的过滤
启动filebeat:
#前台启动
./filebeat -e -c filebeat.yml -d "publish"
#后台启动
nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 &
六、配置Kibana
输入后点击 Next step
选择后点击Create Index pattern,创建好索引后,点击Discover就可以查看日志了!
后期可以根据需求,做nginx反向代理,本次搭建是在阿里云ECS上完成的,没有用阿里云提供的ELK,后续会继续学习ELKF的相关优化,学无止境,愿结伴而行,共勉。