偏头痛杨 2019-06-27
公司需求,要求搭建一套ELK环境,便搜索了一些资料,把整个搭建过程记录下来,以便未来进行翻阅。
ELKF分别是ElasticSearch,Logstash,Kibana和Filebeat:
本次搭建过程,所有软件包用的均是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,如果系统环境已经安装了的话,请跳过本步骤
将压缩包解压到/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)
修改文件句柄数量,将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
解压软件包:
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时生成的
解压软件包:
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-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 &
输入后点击 Next step
选择后点击Create Index pattern,创建好索引后,点击Discover就可以查看日志了!
后期可以根据需求,做nginx反向代理,本次搭建是在阿里云ECS上完成的,没有用阿里云提供的ELK,后续会继续学习ELKF的相关优化,学无止境,愿结伴而行,共勉。