ELK使用手记
使用的6.4.3版本,只用于日志排查,不需要搞最新的
使用centos 7虚拟机实验,java jdk使用1.8版本
下载ElasticSearch,logstash,kibana,filebeats的相应版本。
Elastic官网去下载了8.6.0版本,需要17+的jdk版本。
7.x的版本应该都不能用1.8的jdk了,都是自带jdk,都不喜欢
从华为云下载的6.4.3版本,没试过其他的6.x版本
https://mirrors.huaweicloud.com/home
分别搜索这几个文件下载
全部用6.4.3版本,版本要统一,版本要统一,版本要统一,重要的事情说3遍
也可以尝试其他版本,没试过。
我喜欢用压缩版安装
elasticsearch-6.4.3.tar.gz
logstash-6.4.3.tar.gz
kibana-6.4.3-linux-x86_64.tar.gz
filebeat-6.4.3-linux-x86_64.tar.gz
全部解压到/usr/local/elk/
建立文件夹 /usr/local/elk/es/data/ 和 /usr/local/elk/es/logs/
然后建立一个普通用户es,只有elasticsearch需要用普通用户权限启动
useradd es
然后将elasticsearch文件夹的所有者和组都设置成es这个用户名
chown -R es:es /usr/local/elk/elasticsearch-6.4.3/*
chown -R es:es /usr/local/elk/es/*
用ls -ll看看是否有没设置的文件夹和文件。
全部,全部,全部设置成es用户,重要的事情说3遍,如果你不小心用root用户启动了,你还要再设置一遍
filebeats用于读取文件的内容,输出到logstash,
logstash用于格式转换,输出到ElasticSearch,
ElasticSearch用于快速模糊查找,
kibana用于可视化显示查找的结果
所以我认为最好先启动elasticsearch,再启动logstash,再启动filebeat,
kibana也需要在elasticsearch之后启动
ElasticSearch
打开/usr/local/elk/elasticsearch-6.4.3/config/elasticsearch.yml
在最后加入,根据自己的IP,设置network.host,和discovery.zen.ping.unicast.hosts
这里集群名是:LITANDY_ELK,节点名是:node-1,可以随便写
cluster.name: LITANDY_ELK
node.name: node-1
node.master: true
node.data: true
path.data: /usr/local/elk/es/data
path.logs: /usr/local/elk/es/logs
network.host: 192.168.164.129
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["192.168.164.129:9300"]
discovery.zen.minimum_master_nodes: 1
还需要设置/etc/sysctl,在最后加入
vm.max_map_count=655360
fs.file-max=655360
还需要设置/etc/security/limits.conf,在最后加入
* soft nofile 65536
* hard nofile 65536
* soft nproc 2048
* hard nproc 4096
这些文档中的注释会解释这些配置项的含义,可能配置的不是很节约硬盘空间,可以以后修改
然后切换到es用户
在命令行中执行/usr/local/elk/elasticsearch-6.4.3/bin/elasticsearch
启动elasticsearch一定要切换到普通用户,一定要切换到普通用户,一定要切换到普通用户
不然es文件夹中的文件会被设置成root用户组,使启动报错
在浏览器里输入http://192.168.164.129:9200/
别用localhost,最后能正常显示结果的,就是启动成功了
Logstash
配置Logstash的配置文件,在Logstash的安装目录下的config文件夹中的logstash.yml
在文件的最后加入
path.data: /usr/local/elk/logstash-6.4.3/data
path.logs: /usr/local/elk/logstash-6.4.3/logs
地址别写错了
然后启动logstash,在命令行切换到logstash的bin目录,输入
./logstash -e 'input{stdin{}} output{stdout{codec=>rubydebug}}'
然后输入一些文字,比如:hello world
等一会如果输出没有提示错误,就是成功了
这个是通过命令行输入,通过命令行输出的例子
一般用logstash都是接filebeat的输出,配置如下
input {
beats {
port => "5044"
}
}
output {
stdout { codec => rubydebug }
}
保存成文件testlogstash.yml,然后启动logstash
./logstash -f testlogstash.yml
这里logstash在5044端口等待filebeat的输入,然后处理后的输出信息写入控制台
如果要输出到elasticsearch
可以修改输出配置为
output {
elasticsearch {
hosts => ["192.168.164.129:9200"]
}
}
多个节点用逗号分割
filebeats
配置文件,这里先用一个新文件,testbeats.yml,内容为:
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/elk/filebeat-6.4.3-linux-x86_64/testlog/*.log
setup.template.settings:
index.number_of_shards: 1
output.console:
pretty: true
enabled: true
启动filebeats,指定对应的配置文件
./filebeats -e -c testbeats.yml
如果要将输出输入到logstash或elasticsearch中,可以在配置文件中写
output.elasticsearch:
hosts: ["192.168.164.129"]
或者
output.logstash:
hosts: ["192.168.164.129:5044"]
Kibana
配置Kibana的配置文件,在Kibana的安装目录的config文件夹下的kibana.yml
在配置文件最后加入
server.port: 5601
server.host: "192.168.164.129"
elasticsearch.url: "http://192.168.164.129:9200"
启动bin下的kibana就可以了
然后将5601端口开出来
建立Index pattern
在kibana启动后访问kibana服务主页,
在Management菜单项选择kibana下的Index Patterns
点击左上角的Create Index Pattern按钮,输入logstash-*,这样就可以监控logstash发出的信息
点下一步选@timestamp,作为时间字段,点创建按钮
如果长时间创建不了,可能时硬盘空间不足了,需要扩容。
并且默认情况下elasticsearch在空间不足的情况下会设置成只读模式,任何的写入操作都将失败
有了index pattern才能建立视图和表格
建立柱状图和饼图可以在Visualize菜单项中,点击"+"按钮,建立Vertial Bar或Pie
选择一个index pattern,设置相关的配置,命名保存
在Dashboard菜单项中,建立一个Dashboard,将上面的视图加入,调整位置,命名保存
在dashboard展示时,可以加入过滤器,过滤显示内容
个人不太喜欢用kibana
调试
可选用Chrome浏览器调试
要安装2个Chrome扩展,可以去Chrome Store搜索,但需要FQ,所以从github上找
ElasticSearch-head
用于可视化显示ElasticSearch的各种信息,状态
地址:https://github.com/suifeng1314/es-head
这个一定一定一定要装一个,太好用了
Yet Another REST Client
用于使用Chrome浏览器发送http请求
地址:https://github.com/paulhitz/yet-another-rest-client
可以用postman代替,如果你不嫌蛮烦的话用curl也行
Chrome扩展的安装方法
打开Chrome浏览器,然后URL中输入
chrome://extensions/
然后打开右侧的开发者模式滑块
点击加载已解压的扩展程序
选择包含manifest.json(文件内容中有manifest_version键的json)文件的文件夹,点击打开,
提示失败也不要紧,说什么2版本2023年不能使用,不用理会
由于elasticsearch发送需要application/json;charset=UTF-8头,
而ElasticSearch-head发送的是application/x-www-form-urlencoded头
导致一些内容显示不出,所以修改ElasticSearch-head安装文件夹下的vendor.js
将里面的所有 application/x-www-form-urlencoded 修改为 application/json;charset=UTF-8
应该有2处,这样扩展才能正常的显示查询结果
一直使用这个chrome扩展调试,个人比较喜欢
在虚拟机里打开9200端口
firewall-cmd --zone=public --add-port=9200/tcp --permanent # 开放9200端口
firewall-cmd --reload # 配置立即生效
若要关闭9200端口
firewall-cmd --zone=public --remove-port=9200/tcp --permanent #关闭9200端口
firewall-cmd --reload # 配置立即生效
查看打开了哪些端口
firewall-cmd --zone=public --list-ports
查看程序启动了哪些端口,会列出TCP,UDP,进程号,进程名
netstat -tunlp
ps <pid>
产看进程id对应的详细信息
kill -9 <pid>
杀进程
实在装不上chrome扩展,那就用postman或curl调试吧
使用curl发送http信息,一般linux版本都自带curl
安装ik中文分词器
对text类型字段可以分词,但是默认的分词器只是对英文可以,中文会每个字分成一个词,太拉,需要安装中文分词器
去github下载ik中文分词器,据说是最好的中文分词器,地址
https://github.com/medcl/elasticsearch-analysis-ik/releases
去下载跟你的ElasticSearch相同版本的ik分词器,一个zip文件,也是6.4.3版本,不要搞乱了
方法1:
elasticsearch-plugin install file://<path to the plugin zip file>
方法2:
解压到ElasticSearch的安装目录下的plugins/ik目录下,
重启ElasticSearch,会看到提示
[INFO ][o.e.p.PluginsService ] [node-1] loaded plugin [analysis-ik]
说明ik分词器加载成功,我这里的节点名叫node-1
POST /_analyze
{
"analyzer":"ik_max_word",
"text":"我是中国人"
}
可以测试下是否能分词,如果能分出'中国','中国人','国人'
说明是ik分词起作用了
实际使用时情况
*使用logstash分段内容*(这是关键)
logstash应该是对每一行字符串套用解析规则
可以使用grok插件通过正则表达式解析日志格式
在logstash的配置文件中加入filter
filter {
grok {
match => {
"message" => "(?<queue_id>[0-9A-F]{10,11})"
}
}
}
可以将message字段中的10位或11位的HEX字符串解析出来放入queue_id字段中
也可将多个规则用到一行的解析中,比如:
filter { grok { match => { "message" => [ "^\[%{TIME:time} %{NUMBER:mtime}\] receive: %{GREEDYDATA:receive}", "^\[%{TIME:time} %{NUMBER:mtime}\] exec service: %{GREEDYDATA:service}", "^SeqMsg\-\>PubMsg\-\>\[INFO\] \[%{TIME:time} %{NUMBER:mtime}\] Sending msg : %{GREEDYDATA:send_msg}", "^\[INFO\] \[%{TIME:time} %{NUMBER:mtime}\] %{GREEDYDATA:info}" ] } } }
更多的关于logstash的解析,需要看官方文档
一些错误,如果磁盘空间不足95%,logstash会报
[2023-02-03T14:28:22,578][INFO ][logstash.outputs.elasticsearch] retrying failed action with response code: 403 ({"type"=>"cluster_block_exception", "reason"=>"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"})
[2023-02-03T14:28:22,579][INFO ][logstash.outputs.elasticsearch] Retrying individual bulk actions that failed or were rejected by the previous bulk request. {:count=>1}
这其实elasticsearch返回的
怎样在centos虚拟机中扩容
https://blog.csdn.net/m0_37996629/article/details/127916298
logstash,kibana都可以向elasticsearch中写入数据,引起空间不足,进入只读模式
让elasticsearch恢复可以写入
发送
curl -XPUT -H 'Content-Type: application/json' http://192.168.164:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
配置elasticsearch的中文分词器analysis_ik
索引名称是xxx_log
这里用的6.4.3版本所以文档类型可以自定义的,定义成xxx
7.0以后的版本需要去掉文档类型,默认是doc,就是直接套用properties
指定分片数是1,备份分片数是0
PUT /xxx_log
{
"mappings":{
"xxx":{
"properties":{
"receive":{
"type":"text",
"analyzer":"ik_max_word"
},
"time":{
"type":"keyword"
},
"mtime":{
"type":"keyword"
}
}
}
},
"settings":{
"index.analysis.analyzer.default.type":"ik_max_word",
"number_of_shards":"1",
"number_of_replicas":"0"
}
}
在logstash的配置文件中指定输出的索引和文档类型,如果不指定索引,elasticsearch会建立一堆logstash-<日期>的索引,不太美观
output {
elasticsearch {
hosts => ["192.168.164.129:9200"]
index => "xxx_log"
document_type => "xxx"
}
}
重启logstash
如果有特别的单词ik分词器也无法分词,就直接放入用户定义词典,让elasticsearch加载
在elasticsearch安装文件夹的plugin/ik/config文件夹下建立自定义词典,比如xxx.dic
内容:每一行定义一个特殊词
有个配置文件IKAnalyzer.cfg.xml,打开,找到在里面的这里<entry key="ext_dict">位置写入
<entry key="ext_dict">xxx.dic</entry>
重新启动elasticsearch就可以加载自定义的词来分词了