ELK学习笔记(一)
前段时间排查项目日志找bug时,查看大量日志查的苦不堪言。由于部署在服务器上,还是把日志写成多个100M的日志.log文件夹。排查问题时耗费大量的时间。然后选择后续改用了阿里云的云服务的SLS日志服务。感受是相当好用。于是!我便了解起了类似于SLS日志服务的相关技术。就是这个ELK。分别是(Elasticsearch,Logstash,Kibana)。话不多说先把Elasticsearch,Logstash,Kibana三个模块简单介绍一下后。马上本地部署一套使用。用过了就知道是什么东西。
Elasticsearch
Elasticsearch 是一种分布式搜索和分析引擎、可扩展数据存储和矢量数据库,针对生产规模工作负载的速度和相关性进行了优化。Elasticsearch 是 Elastic 开放 Stack 平台的基础。近乎实时地搜索海量数据集、执行矢量搜索、与生成式 AI 应用程序集成等等。(取自官方说明)。
Elasticsearch 我们常说的搜索引擎了。那么他是做什么的呢?常见的应用场景有全文搜索、日志分析、数据分析、监控系统。本篇主要讲的是日志分析。也就是我们用到的ELK。在ELK中Elasticsearch主要角色是存储和搜索。负责存储 文档型(JSON)的日志,以及提供对日志的搜索能力。
Logstash
Logstash 是一个开源服务器端数据处理管道,它从多种来源获取数据,对其进行转换,然后将其发送到您最喜欢的“存储”(取自官方说明)。主要负责数据采集,数据清洗,格式转换,然后存进Elasticsearch。支持读取多种来源的数据比如日志文件,数据库,kafuka,rabbitmq等多种来源的数据。
Kibana
Kibana数据的可视化工具。在这ELK提供了我们日志采集的可视化界面,以及搜索,统计,分析等功能。当然他本身并不具备搜索功能。只是一个前端展示层。他是通过依赖于Elasticserach的来执行搜索的。他能将用户在可视化界面的查询请求转为Elasticsearch的查询api。从而实现搜索的功能。
部署
由于主要用于学习目的。选择在windows上做一下简单的部署。采用docker的方式。
安装docker
自行安装docker desktop
编写docker compose
内容如下,自己网上搜或者找ai工具写一下都可以
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.1
container_name: elasticsearch
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "discovery.type=single-node"
- "xpack.security.enabled=false" # 关闭安全验证(适用于本地开发)
ports:
- "9200:9200"
- "9300:9300"
volumes:
- D:\docker\ELK\data:/usr/share/elasticsearch/data # 持久化数据
kibana:
image: docker.elastic.co/kibana/kibana:8.11.1
container_name: kibana
environment:
- "ELASTICSEARCH_HOSTS=http://elasticsearch:9200"
ports:
- "5601:5601"
depends_on:
- elasticsearch
logstash:
image: docker.elastic.co/logstash/logstash:8.11.1
container_name: logstash
volumes:
- D:\docker\ELK\logstash/config:/usr/share/logstash/config # 挂载 Logstash 配置文件
- D:\docker\ELK\logstash/pipeline:/usr/share/logstash/pipeline # 挂载 Logstash pipeline
environment:
- "LS_JAVA_OPTS=-Xms256m -Xmx512m" # 调整 Logstash 的 JVM 内存
ports:
- "5044:5044" # Beats 输入(可选)
- "9600:9600" # Logstash API 端口
depends_on:
- elasticsearch
D:\docker\ELK\logstash/config 映射到容器内/usr/share/logstash/config
是 Logstash 的核心配置目录,用于存储全局配置文件、管道定义、环境变量等下。文件分别有
logstash.yml 内容如下
http.host: "0.0.0.0"
xpack.monitoring.enabled: false # 关闭监控(可选)
pipelines.yml 内容如下
- pipeline.id: main
path.config: "/usr/share/logstash/pipeline/logstash.conf"
D:\docker\ELK\logstash/pipeline:/usr/share/logstash/pipeline映射到容器内的/usr/share/logstash/pipeline目录 用于存储 管道配置文件(Pipeline Configuration Files)。这些文件定义了 Logstash 如何处理数据,包括数据的输入、过滤和输出。该目录文件有
logstash.conf 内容如下
# 输入的配置,通过TCP从5044端口输入。这里需要容器把5044端口映射出去。
input {
tcp {
port => 5044
}
}
filter {
json {
source => "message"
}
}
# 输出配置。把数据输出到elasticsearch,并生成动态索引名。
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "logstash-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug } # 打印日志到控制台,方便调试
}
配置完以上东西后,运行docker compose up -d 即可运行起来。
确认一下容器是否都运行起来
这里如果有网络问题。排查三个容器是否在同一个docker网络下。接着访问一下浏览器http://localhost:5601便可以进入到kibana可视化界面了
编写demo
由于我自己是写java的所有这里写了一个springboot的demo尝试一下
创建一个springboot应用。
在pom文件引入依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.4</version>
</dependency>
配置logback.xml文件
<configuration>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:5044</destination> <!-- Logstash 的地址和端口 -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<root level="INFO">
<appender-ref ref="LOGSTASH" />
</root>
</configuration>
写一个测试接口
package org.example.elk_demo1.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {
@RequestMapping("test1")
public Object test1() {
log.info("test1方法调用成功");
return "调用成功";
}
}
运行起来调用一下接口
然后访问http://localhost:5601进入kibana左侧菜单栏Discover。创建数据视图便可查看到我们发送的日志了。
这里logstash-2025.03.09就是前面D:\docker\ELK\logstash/pipeline:/usr/share/logstash/pipeline目录下的logstash.conf文件配置的index => “logstash-%{+YYYY.MM.dd}”。可以根据不同的项目在/usr/share/logstash/pipeline配置多个管道不同的索引来区分项目。并在kibana创建对应不同项目的视图。
创建完视图我们就可以看到我们刚刚发送的日志了,并且在kibana可以进行筛选,查询,统计等操作。
ELK学习笔记(二)(简单介绍了spring cloud sleuth在ELK作为日志服务中的作用,以及kibana的简单使用)