部署 elasticsearch 和 kibana
因为是 demo
性质的应用,所以就用 docker-compose
简略跑一下
version: "3"
services:
elk-elasticsearch:
container_name: elk-elasticsearch
image: elasticsearch:7.17.1
ports:
- "9200:9200"
- "9300:9300"
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms1g -Xmx1g" # 限度 es 的内存大小,不然会吃掉 10GB+ 的 RAM
elk-kibana:
container_name: elk-kibana
image: kibana:7.17.1
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://192.168.31.245:9200
volumes:
- ./kibana.yml:/usr/share/kibana/config/kibana.yml # kibana 其实是反对中文的,只有在 /usr/share/kibana/config/kibana.yml 加一行 i18n.locale: "zh-CN"
elasticsearch
和 kibana
的版本要统一。同样的,前面的 filebeat
也要版本统一!
这次咱们都用 7.17.1
如果须要用 dbeaver 之类的工具连贯 elasticsearch 遇到
current license is non-compliant for [jdbc]
,能够参考:current license is non-compliant for jdbc 解决!
创立索引
一开始,我参考了这个教程:EFK 搭建简略的日志剖析零碎
不得不说这个教程写的十分的烂,缺斤短两,但即便如此,这曾经还是谷歌搜寻进去排名靠前
部署好了 elasticsearch 和 kibana 之后,咱们须要去 elasticsearch
创立索引
为什么须要创立索引(index)?
index
这个概念在 elasticsearch 中就相当于 mysql 中的 table(elasticsearch 没有 db 这个概念)。次要留神的是,elasticsearch 的 index,创立的时候,只给一个index name
就能够,不须要定义 schema。
咱们须要 index 作为日志的存储容器,不同 index 存储不同 project 或者说不同业务的日志。总不能把所有日志都存在同一个 index 吧!
怎么创立索引?办法有很多,比方:
- 通过
dbeaver
,连贯到 elasticsearch,而后在 dbeaver 为 elasticsearch 创立索引 - 应用
kibana
连贯到 elasticsearch,而后在 kibana 为 elasticsearch 创立索引 - 应用
python
、java 等编程语言提供的elasticsearch client sdk
间接连贯到 elasticsearch 创立索引
我抉择 python,因为我对这个最相熟
python 的 elasticsearch client sdk 版本也要版本保持一致!
pip install elasticsearch==7.17.1
对于如何应用 elasticsearch client sdk 操作 elasticsearch,能够参考这篇文章: Elasticsearch 根本介绍及其与 Python 的对接实现(这个文章中的 elasticsearch client sdk 比拟老,所以一些 api 的参数名等等都产生了变动了)
上面给几个参考代码:
创立 index
, 我这里就叫做 ideaboom
了
from elasticsearch import Elasticsearch
es = Elasticsearch("http://192.168.31.245:9200")
result = es.indices.create(index='ideaboom')
print(result)
这里很简略,实际上,你还须要增加一些参数,比方指定 index 的『正本数』、『分片数』。比方你的 elasticsearch 集群有 3 个 node,那『分片数』就应该是 3 的倍数,这样能力更好的利用集群的资源!
裸机应用 filebeat 采集裸机上的日志文件,并发到 elasticsearch
先装置 filebeat
参考:Filebeat quick start: installation and configuration
在 debian 系中装置 filebeat7.17.1
下载:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.1-amd64.deb
超级快,都不须要代理
装置:
sudo apt install ./filebeat-7.17.1-amd64.deb
应用 filebeat 采集数据,并发送到 elasticsearch
对于 filebeat 的语法,能够参考:filebeat 输入后果到 elasticsearch 的多个索引
我的 filebeat.yml 内容如下:
filebeat.inputs:
- type: log
# Change to true to enable this input configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
# 日志理论门路地址
- /home/bot/Desktop/coder/ideaboom/test_ELK_EFK/logs/run.log
fields:
# 日志标签,区别不同日志,上面建设索引会用到
type: "ideaboom"
fields_under_root: true
# 指定被监控的文件的编码类型,应用 plain 和 utf- 8 都是能够解决中文日志的
encoding: utf-8
# setup.kibana:
# host: "192.168.31.245:5601"
setup.ilm.enabled: false
output.elasticsearch:
hosts: ["192.168.31.245:9200"]
indices:
#索引名称,个别为‘服务名称 +ip+ --%{+yyyy.MM.dd}’。- index: "ideaboom-%{+yyyy.MM.dd}"
when.contains:
#标签,对应日志和索引,和下面对应
type: "ideaboom"
后面曾经在 elasticsearch 创立了名为 ideaboom 的 index
采集的是 run.log 文件,我往这个文件中轻易放一点货色:
2022-07-08 02:39:39,746 - 13651 - logger - INFO - total [1] urls, max_id [69013414]
2022-07-08 02:39:39,746 - 13651 - logger - INFO - total [1] urls, max_id [69013415]
2022-07-08 02:39:39,746 - 13651 - logger - INFO - total [1] urls, max_id [69013414]
2022-07-08 02:39:39,746 - 13651 - logger - INFO - total [1] urls, max_id [69013415]
2022-07-08 02:39:39,746 - 13651 - logger - INFO - total [1] urls, max_id [69013414]
2022-07-08 02:39:39,746 - 13651 - logger - INFO - total [1] urls, max_id [69013415]
相似 nginx,咱们须要把本人的 yml 映射到 filebeat 的默认配置文件门路
sudo cp /home/bot/Desktop/coder/ideaboom/test_ELK_EFK/filebeat.yml /etc/filebeat/filebeat.yml
对于默认配置文件门路的问题,能够参考:为什么应用了 -c 参数,filebeat 还是去加载 etc 中的 filebeat.yml?
运行 filebeat
sudo filebeat
留神,运行 filebeat 有很多的坑,filebeat 为了所以的数据安全,要求 root 运行 filebeat,如果不是 root 运行,相干的配置文件的 owner 必须要是运行 filebeat user 保持一致等等。不然会遇到
ubuntu debian Exiting: error loading config file: open /etc/filebeat/filebeat.yml: permission denied
相似的报错!还有一点须要超级留神,filebeat 是没有输入的,就是不论有没有采集到日志,有没有把日志发送到 elasticsearch 他都不会通知你!(可能有方法能够晓得,然而我不晓得怎么搞),这就很坑,为了晓得 filebeat 有没有失常工作,我还特意开了 wireshark 来抓包!
在 elasticsearch 中查看日志
假如,到这一步的时候,你的 filebeat 曾经胜利才采集到了日志,并且胜利将日志发送到了 elasticsearch
咱们能够在 dbeaver 中查看(如果没有装置 dbeaver 能够跳过这一步)