1、什么是 ELK Stack?
那么,ELK 到底是什么呢? “ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。
Elastic Stack 是 ELK Stack 的更新换代产品。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LyMVuef2-1678518175643)(null)]
Elasticsearch:这个开源的分布式搜索引擎基于 JSON 开发而来,具有 RESTful 风格。它使用简单,可缩放规模,十分灵活,因此受到用户的热烈好评,而且如大家所知,围绕这一产品还形成了一家专门致力于搜索的公司。
**Logstash和Kibana:**Elasticsearch 的核心是搜索引擎,所以用户开始将其用于日志用例,并希望能够轻松地对日志进行采集和可视化。有鉴于此,我们引入了强大的采集管道 Logstash 和灵活的可视化工具 Kibana。
**Beats:**我们向 ELK Stack 中加入了一系列轻量型的单一功能数据采集器,并把它们叫做 Beats。
官网:https://www.elastic.co/cn/what-is/elk-stack
2、ELK常见的几种架构体系
2.1、Elasticsearch + Logstash + Kibana
此架构由Logstash分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储并提供多种API供用户查询,操作。用户亦可以更直观的通过配置Kibana Web方便的对日志查询,并根据数据生成报表。
这是最简单的一种ELK架构方式。优点是搭建简单,易于上手。缺点是Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患。
2.2、Elasticsearch + Logstash + Filebeat + Kibana
与上一种架构相比,这种架构增加了一个filebeat模块。filebeat是一个轻量的日志收集代理,用来部署在客户端,优势是消耗非常少的资源(较logstash), 所以生产中,往往会采取这种架构方式,此种架构将收集端logstash替换为beats,更灵活,消耗资源更少,扩展性更强。同时可配置Logstash 和Elasticsearch 集群用于支持大集群系统的运维日志数据监控和查询。但是这种架构有一个缺点,没有消息队列缓存,当logstash出现故障,会造成日志的丢失。
2.3、Elasticsearch + Logstash + Filebeat + Redis(Kafka)+ Kibana
logstash节点和elasticsearch节点可以根据日志量伸缩节点数量, filebeat部署在每台需要收集日志的服务器上。
此种架构引入了消息队列机制,位于各个节点上的beats先将数据/日志传递给消息队列(kafka、redis、rabbitMQ等),logstash从消息队列取数据进行过滤、分析后将数据传递给Elasticsearch存储。最后由Kibana将日志和数据呈现给用户。因为引入了Kafka(或者Redis),所以即使远端Logstash server因故障停止运行,数据将会先被存储下来,从而避免数据丢失。
工作流程:Filebeat采集—>发到kafka—> logstash处理从kafka缓存的数据进行分析—> 输出到es—> 显示在kibana
这种模式特点:这种架构适合于日志规模比较庞大的情况。但由于 Logstash 日志解析节点和 Elasticsearch 的负荷比较重,可将他们配置为集群模式,以分担负荷。引入消息队列,均衡了网络传输,从而降低了网络闭塞,尤其是丢失数据的可能性。
3、Docker部署ELK日志监控分析系统
3.1、下载需要的镜像
docker pull elasticsearch:7.17.7
docker pull logstash:7.17.7
docker pull kibana:7.17.7
3.2、下载docker-compose命令
下载dokcer-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
给dokcer-compose权限
sudo chmod +x /usr/local/bin/docker-compose
3.3、编写配置文件
# 系统下创建目录架构
opt
elk
elasticsearch
data #必须拥是777权限
elasticsearch.yml
kibana
kibana.yml
logstash
pipeline
logstash.conf
logstash.yml
docker-compose.yml
touch -p /opt/elk/docker-compose.yml
mkdir -p /opt/elk/elasticsearch/data
touch -p /opt/elk/elasticsearch/elasticsearch.yml
sudo chmod 777 /opt/elk/elasticsearch/data
touch -p /opt/elk/kibana/kibana.yml
touch -p /opt/elk/logstash/pipeline/logstash.conf
touch -p /opt/elk/logstash/logstash.yml
elasticsearch.yml
内容如下
## Default Elasticsearch configuration from Elasticsearch base image.
### https://github.com/elastic/elasticsearch/blob/master/distribution/docker/src/docker/config/elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
### X-Pack settings
### see https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-xpack.html
xpack.license.self_generated.type: trial
xpack.security.enabled: true
xpack.monitoring.collection.enabled: true
kibana.yml
内容如下
## Default Kibana configuration from Kibana base image.
### https://github.com/elastic/kibana/blob/master/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.js
server.name: kibana
server.host: 0.0.0.0
i18n.locale: "zh-CN"
elasticsearch.hosts: [ "http://192.168.56.103:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
### X-Pack security credentials
elasticsearch.username: elastic
elasticsearch.password: elk123456
logstash.yml
内容如下
## Default Logstash configuration from Logstash base image.
### https://github.com/elastic/logstash/blob/master/docker/data/logstash/config/logstash-full.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.56.103:9200" ]
### X-Pack security credentials
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: elk123456
logstash.conf
内容如下
input {
tcp {
port => 5000
}
}
filter {}
### Add your filters / logstash plugins configuration here
output {
elasticsearch {
hosts => "192.168.56.103:9200"
user => "elastic"
password => "elk123456"
### 日志索引名称
index => "elk"
}
}
docker-compose.yml
内容如下
version: "2.2"
services:
###配置elasticsearch
es:
image: elasticsearch:7.8.0
container_name: elasticsearch
ports:
- "9200:9200"
- "9300:9300"
environment:
discovery.type: single-node
###es的密码
ELASTIC_PASSWORD: elk123456
ES_JAVA_OPTS: "-Xmx256m -Xms256m"
volumes:
# 这里注意一下 如果你想吧docker中es的数据 映射出来 你本地的 /opt/elk/elasticsearch/data 必须拥有 777权限
- /opt/elk/elasticsearch/data:/usr/share/elasticsearch/data
- /opt/elk/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
network_mode: host
###配置Logstash
ls:
image: logstash:7.8.0
container_name: logstash
ports:
- "5000:5000/tcp"
- "5000:5000/udp"
- "9600:9600"
network_mode: host
environment:
discovery.type: single-node
ES_JAVA_OPTS: "-Xmx256m -Xms256m"
volumes:
###将本机目录/opt/elk/logstash/pipeline下的文件映射到docker容器里面
- /opt/elk/logstash/pipeline:/usr/share/logstash/pipeline
- /opt/elk/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml
depends_on:
- es
###配置Kibana
kb:
image: kibana:7.8.0
container_name: kibana
ports:
- "5601:5601"
volumes:
###将本机目录/opt/elk/kibana/kibana.yml下的文件映射到docker容器里面
- /opt/elk/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml
network_mode: host
depends_on:
- es
discovery.type:表示这是单机启动
ES_JAVA_OPTS:配置该容器占用主机的内存等等
network_mode:设置docker容器的网络模式
depends_on:指必须后面的服务启动以后 这个才启动
3.4、部署完成启动
cd /opt/elk
docker-compose up
3.5、访问kibana(记得打开个工具端口)
http://192.168.56.103:5601/
用户名:elastic
密码:elk123456
4、Springboot集成Logstash
在pom文件中添加以下依赖 让springboot
的日志集成logstash
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.2</version>
</dependency>
在resources
下添加logback
和logstash
集成的文件
logback-spring.xml
配置如下
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--配置logstash 发送日志数据的地址 -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.56.103:5000</destination>
<!--自己定义logstash的encoder-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--springboot的日志 -->
<include resource="org/springframework/boot/logging/logback/base.xml" />
<!--日志的打印级别 -->
<root level="INFO">
<appender-ref ref="LOGSTASH" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
application.properties
配置如下
logging.config= classpath:logback-spring.xml