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就可以加载自定义的词来分词了

posted on 2023-02-14 14:27  litandy  阅读(61)  评论(0编辑  收藏  举报

导航