一文讲清---ELK搭建

ELK 是由三个核心开源组件组成的日志管理套件,分别代表 Elasticsearch、Logstash 和 Kibana,。它被广泛用于采集、存储和检索系统日志数据

前言

1.需要准备一台linux服务器(最好是CentOS7),内存至少4g以上(三个组件都比较占用内存)

2.需要有docker使用经验

目录

    • 前言
    • [1 docker安装ElasticSearch](#1 docker安装ElasticSearch)
    • [2 docker安装kibana](#2 docker安装kibana)
    • [3 docker安装logstash](#3 docker安装logstash)
      • [3.1 创建容器](#3.1 创建容器)
      • [3.2 修改配置](#3.2 修改配置)
        • [3.2.1 设置ES的地址](#3.2.1 设置ES的地址)
    • [2 docker安装kibana](#2 docker安装kibana)
    • [3 docker安装logstash](#3 docker安装logstash)
      • [3.1 创建容器](#3.1 创建容器)
      • [3.2 修改配置](#3.2 修改配置)
        • [3.2.1 设置ES的地址](#3.2.1 设置ES的地址)
      • [3.2.2 设置logstash收集日志的输入和输出](#3.2.2 设置logstash收集日志的输入和输出)
    • [4 应用系统对接logstash](#4 应用系统对接logstash)
    • [5 ELK基本使用](#5 ELK基本使用)
      • [5.1 查看索引文件](#5.1 查看索引文件)
      • [5.2 添加索引模式](#5.2 添加索引模式)
      • [5.3 检索日志](#5.3 检索日志)
  • 思维导图

1 docker安装ElasticSearch

这里先创建一个网络:因为我们还需要部署kibana容器、logstash容器,需要让这些容器互联。

shell 复制代码
docker network create elk-net

这里ElasticSearch采用的是7.12.1版本

在docker中搜索和下载对应的镜像

shell 复制代码
#搜索镜像
docker search elasticsearch
#下载镜像
docker pull elasticsearch:7.12.1

有了镜像以后,可以直接创建对应的容器,命令如下:

shell 复制代码
docker run -d \
	--name es \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -e "discovery.type=single-node" \
    -v es-data:/usr/share/elasticsearch/data \
    -v es-plugins:/usr/share/elasticsearch/plugins \
    --privileged \
    --network elk-net \
    -p 9200:9200 \
    -p 9300:9300 \
elasticsearch:7.12.1

命令解释:

  • -e "cluster.name=es-docker-cluster":设置集群名称
  • -e "http.host=0.0.0.0":监听的地址,可以外网访问
  • -e "ES_JAVA_OPTS=-Xms512m -Xmx512m":内存大小
  • -e "discovery.type=single-node":非集群模式
  • -v es-data:/usr/share/elasticsearch/data:挂载逻辑卷,绑定es的数据目录
  • -v es-logs:/usr/share/elasticsearch/logs:挂载逻辑卷,绑定es的日志目录
  • -v es-plugins:/usr/share/elasticsearch/plugins:挂载逻辑卷,绑定es的插件目录
  • --privileged:授予逻辑卷访问权
  • --network elk-net :加入一个名为es-net的网络中
  • -p 9200:9200:端口映射配置

在浏览器中输入:http://192.168.200.130:9200 (按照自己的ip访问)即可看到elasticsearch的响应结果:

2 docker安装kibana

创建容器(如果不提前下载好,在创建容器时,会先下载,然后创建容器)

shell 复制代码
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
-e "I18N_LOCALE=zh-CN" \
--network=elk-net \
-p 5601:5601  \
kibana:7.12.1
  • --network elk-net :加入一个名为es-net的网络中,与elasticsearch在同一个网络中
  • -e ELASTICSEARCH_HOSTS=http://es:9200":设置elasticsearch的地址,因为kibana已经与elasticsearch在一个网络,因此可以用容器名直接访问elasticsearch
  • -p 5601:5601:端口映射配置

此时,在浏览器输入地址访问:http://192.168.200.130:5601,即可看到结果

3 docker安装logstash

3.1 创建容器

shell 复制代码
docker run -d -p 5044:5044 -p 9600:9600 --name logstash --network=elk-net logstash:7.12.1

3.2 修改配置

3.2.1 设置ES的地址

创建完容器之后,需要在容器修改一些配置

shell 复制代码
#进入容器
docker exec -it logstash /bin/bash

找到config目录中的logstatsh.yml文件

2 docker安装kibana

创建容器(如果不提前下载好,在创建容器时,会先下载,然后创建容器)

shell 复制代码
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
-e "I18N_LOCALE=zh-CN" \
--network=elk-net \
-p 5601:5601  \
kibana:7.12.1
  • --network elk-net :加入一个名为es-net的网络中,与elasticsearch在同一个网络中
  • -e ELASTICSEARCH_HOSTS=http://es:9200":设置elasticsearch的地址,因为kibana已经与elasticsearch在一个网络,因此可以用容器名直接访问elasticsearch
  • -p 5601:5601:端口映射配置

此时,在浏览器输入地址访问:http://192.168.200.130:5601,即可看到结果

3 docker安装logstash

3.1 创建容器

shell 复制代码
docker run -d -p 5044:5044 -p 9600:9600 --name logstash --network=elk-net logstash:7.12.1

3.2 修改配置

3.2.1 设置ES的地址

创建完容器之后,需要在容器修改一些配置

shell 复制代码
#进入容器
docker exec -it logstash /bin/bash

找到config目录中的logstatsh.yml文件

修改里面的内容,设置es服务的地址,如下

yaml 复制代码
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.200.130:9200" ] #设置跟es的服务地址

3.2.2 设置logstash收集日志的输入和输出

进入容器

shell 复制代码
#进入容器
docker exec -it logstash /bin/bash

找到pipeline目录中的logstatsh.conf文件

修改如下,可以设置数据输入的方式,也可以设置把数据存放到哪里

shell 复制代码
input {
  tcp {
    mode => "server"
    host => "0.0.0.0"  # 允许任意主机发送日志
    port => 5044
    codec => json_lines    # 数据格式
  }
}

output {
  elasticsearch {
      hosts  => ["http://192.168.200.130:9200"]   # ElasticSearch 的地址和端口
      index  => "log-%{+YYYY.MM.dd}"         # 指定索引名,可以根据自己的需求指定命名
      codec  => "json"
  }
  stdout {
    codec => rubydebug
  }
}

修改完所有的配置后,需要重启logstash容器

shell 复制代码
docker restart logstash

4 应用系统对接logstash

在项目的pom文件中添加新的依赖

xml 复制代码
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>6.6</version>
</dependency>

目前,我们采用的logback来采集日志进行上报给logstash

需要在resources目录中新增一个文件logback-spring.xml(注意命名,不要修改)

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
    <springProperty scope="context" name="serverPort" source="server.port"/>
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--logstash的服务地址和端口,可以实际情况设置-->
        <destination>192.168.200.130:5044</destination>
        <!-- 日志输出编码 -->
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        <!--应用名称 -->
                        "app": "${springAppName}_${serverPort}",
                        <!--打印时间 -->
                        "timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
                        <!--线程名称 -->
                        "thread": "%thread",
                        <!--日志级别 -->
                        "level": "%level",
                        <!--日志名称 -->
                        "logger_name": "%logger",
                        <!--日志信息 -->
                        "message": "%msg",
                        <!--日志堆栈 -->
                        "stack_trace": "%exception"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>
    <!--定义日志文件的存储地址,使用绝对路径-->
    <property name="LOG_HOME" value="/home/logs"/>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <fileNamePattern>${LOG_HOME}/${springAppName}-${serverPort}-%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="LOGSTASH" />
        <appender-ref ref="FILE" />
        <appender-ref ref="CONSOLE" />
    </root>


</configuration>

也可以在专门在application.yml文件中设置logback配置的目录

yaml 复制代码
logging:
  config: classpath:logback-spring.xml

5 ELK基本使用

5.1 查看索引文件

对接项目之后,可以启动项目,产生一些日志数据

然后打开kibana,找到索引管理

可以直接查看已创建的日志索引

5.2 添加索引模式

如果想用kibana方便的查看日志的数据,可以添加索引模式,如下图

点击下一步,添加筛选的字段,一般都是时间戳字段,最后点击创建索引模式

5.3 检索日志

打开Discover

检索日志,选择不同的索引,可以按照不同的字段检索,或者在输入框直接输入内容,也是可以的

思维导图


来源

黑马程序员

相关推荐
Flittly7 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了7 小时前
Java 生成二维码解决方案
java·后端
人活一口气12 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
NE_STOP13 小时前
Vibe Coding -- 完整项目案例实操
java
荣码13 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
SimonKing13 小时前
Google第三方授权登录
java·后端·程序员
明月光81813 小时前
从一行 @Builder 说起:重新拾起 Java 的 Lombok、注解与 Builder 模式
java
考虑考虑1 天前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯1 天前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路1 天前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java