Integre Springboot + docker + ELK para implementar la recopilación y visualización de registros

1. Introducción a ELK

Insertar descripción de la imagen aquí
ELK son tres componentes de Elastic, que trabajan juntos para implementar la recopilación de registros.

  • ElasticSearch : una herramienta de búsqueda / almacenamiento distribuido de registros que admite de forma nativa funciones de clúster . Elasticsearch proporciona búsqueda y análisis casi en tiempo real para todo tipo de datos. Ya sea texto estructurado o no estructurado, datos numéricos o datos geoespaciales, Elasticsearch los almacena e indexa de manera eficiente de una manera que admite búsquedas rápidas.
  • Logstash : se utiliza para recopilar , procesar y reenviar información de registro. Puede recopilar datos de múltiples fuentes, como discos locales, servicios de red (puertos de autocontrol, aceptar registros de usuarios), colas de mensajes, etc., convertir los datos y luego filtrarlos. analizar y enviar los datos al "repositorio" favorito (Elasticsearch, etc.). Logstash puede recopilar, transformar y transmitir datos dinámicamente, independientemente del formato o la complejidad. Aproveche Grok para derivar estructura a partir de datos no estructurados, decodificar coordenadas geográficas de direcciones IP, anonimizar o excluir campos confidenciales y optimizar el procesamiento general.
  • Kibana : es una plataforma de visualización y análisis de código abierto para Elasticsearch, que se utiliza para buscar y ver datos almacenados de forma interactiva en el índice de Elasticsearch. Con Kibana, puede realizar análisis de datos avanzados y visualizarlos en varios gráficos. Y puede proporcionar una interfaz web compatible con el análisis de registros para Logstash y ElasticSearch, que puede resumir, analizar y buscar registros de datos importantes. También puede facilitar la comprensión de grandes cantidades de datos. Es fácil de operar y la interfaz de usuario basada en navegador puede crear rápidamente un panel (Dashboard) para mostrar la dinámica de consultas de Elasticsearch en tiempo real.

En pocas palabras: Logstash recopila, procesa y reenvía información, Elasticsearch almacena y busca información y Kibana muestra información.

2. Logstash (breve introducción, porque Logstash requiere más configuración)

La canalización de procesamiento de eventos de Logstash tiene tres etapas: entradasfiltrossalida . Las entradas generan eventos ( colección ), los filtros los modifican ( procesamiento ) y las salidas los envían a otra parte ( reenvío ).

2.1 、 entradas

El complemento de entrada se utiliza para extraer datos, que pueden provenir de archivos de registro, escuchas TCP o UDP, uno de varios complementos específicos de protocolo (como syslog o IRC) o incluso un sistema de colas (como Redis, AQMP o Kafka). . Esta fase etiqueta los eventos entrantes con metadatos que rodean el origen del evento.
Algunas entradas comúnmente utilizadas:

  • archivo: leer desde un archivo en el sistema de archivos
  • redis: leer desde el servidor redis
  • beats: maneja eventos enviados por Beats.
  • tcp: lectura de eventos desde un socket TCP

2.1 、 filtros

Los filtros son dispositivos de procesamiento intermedio en el proceso de Logstash. Los filtros se pueden combinar con condiciones para realizar acciones en eventos si cumplen ciertos criterios. En otras palabras, se puede realizar algún procesamiento sobre el evento.
Algunos filtros útiles incluyen:

  • grok: analiza y construye texto arbitrario. Grok es actualmente la mejor manera en Logstash de analizar datos de registro no estructurados en estructurados y consultables.
  • mutar: realiza transformaciones generales en campos de eventos. Puede cambiar el nombre, eliminar, reemplazar y modificar campos en eventos.
  • soltar: elimina completamente un evento, como un evento de depuración.
  • geoip: Agrega información sobre la ubicación geográfica de la dirección IP

2.1 、 salidas

las salidas son la etapa final del proceso de Logstash y pueden cargar eventos procesados ​​en otra cosa, como ElasticSearch u otra base de datos de documentos, o un sistema de cola como Redis, AQMP o Kafka. También se puede configurar para comunicarse con API. Un evento puede tener múltiples salidas, pero una vez que se hayan procesado todas las salidas, el evento habrá completado su ejecución.
Algunas salidas comúnmente utilizadas incluyen:

  • elasticsearch: envía datos de eventos a Elasticsearch.
  • archivo: escribe datos del evento en un archivo en el disco.
  • kafka: escribir eventos en el tema de Kafka

3. Construcción del entorno SpringBoot + ELK

Introducción al entorno local:
Linux:

pikaqiu@pikaqiu-virtual-machine:~$ uname -a
Linux pikaqiu-virtual-machine 5.11.0-27-generic #29~20.04.1-Ubuntu SMP Wed Aug 11 15:58:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Entorno acoplable:

pikaqiu@pikaqiu-virtual-machine:~$ docker version
Client: Docker Engine - Community
 Version:           20.10.0
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        7287ab3
 Built:             Tue Dec  8 18:59:53 2020
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.0
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       eeddea2
  Built:            Tue Dec  8 18:57:44 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.3
  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc:
  Version:          1.0.0-rc92
  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Entorno de composición de Docker:

pikaqiu@pikaqiu-virtual-machine:~$ docker-compose version
docker-compose version 1.24.1, build 4667896b
docker-py version: 3.7.3
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.1.0j  20 Nov 2018

3.1 Preparación del entorno ELK

El entorno ELK se construye utilizando dokcer-compose

3.1.1 Crear directorios y archivos de configuración

1) Crear un directorio de datos de elasticsearch y un directorio de complementos

mkdir -p /home/pikaqiu/elk/elasticsearch/data
mkdir -p /home/pikaqiu/elk/elasticsearch/plugins
// elasticsearch数据文件夹授权,保证docker容器中读写权限
chmod 777 /home/pikaqiu/elk/elasticsearch/data

2) Cree el directorio kibana y configure kibana.yml

mkdir -p /home/pikaqiu/elk/kibana/config
touch /home/pikaqiu/elk/kibana/config/kibana.yml
#
# ** THIS IS AN AUTO-GENERATED FILE **
#

# Default Kibana configuration for docker target
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
# 注意是你的本地IP
elasticsearch.hosts: [ "http://192.168.88.158:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

#汉化
i18n.locale: "zh-CN"

3) Cree el directorio logstash y configure el archivo logstash.conf

mkdir -p /home/pikaqiu/elk/logstash/conf.d
touch /home/pikaqiu/elk/logstash/conf.d/logstash.conf

Edite y configure logstash.conf, el contenido es el siguiente:
El complemento de entrada utilizado por logstash aquí es tcp, que se puede modificar para archivar o batir según sus propias necesidades.
Debido a que es necesario iniciar dos microservicios, logstash necesita configurar dos canalizaciones aquí. Usé dos tcp y el complemento de salida también realizó la configuración correspondiente.

input {
  # 创建了两个微服务, 所以建立两个不同的输入,将两个服务的日志分别输入到不同的index中
  tcp {
    mode => "server" #server表示侦听客户端连接,client表示连接到服务器
    host => "0.0.0.0" #当mode为server时,表示要监听的地址。当mode为client时,表示要连接的地址。
    type => "elk1" #设定type以区分每个输入源。
    port => 4560 #当mode为server时,要侦听的端口。当mode为client时,要连接的端口。
    codec => json #用于输入数据的编解码器
  }
  
  tcp {
    mode => "server"
    host => "0.0.0.0"
    type => "elk2"
    port => 4660
    codec => json
  }
}

filter{
  # 可按照需求配置
}

output {
  if [type] == "elk1"{
    elasticsearch { 
      action => "index"  #输出时创建映射 
      hosts => "es:9200" #设置远程实例的主机(Elasticsearch的地址和端口,可以用es这个域名访问elasticsearch服务,看完docker-compose即可理解)。
      index => "elk1-%{+YYYY.MM.dd}" #指定事件要写入的索引名,对应于kibana中的索引模式 
    }
  }
  
   if [type] == "elk2"{
    elasticsearch {
      action => "index"
      hosts => "es:9200" 
      index => "elk2-%{+YYYY.MM.dd}" 
    }
  }
}

4) Cree el archivo docker-compose.yml y configúrelo

touch /home/pikaqiu/elk/docker-compose.yml
version: '3.7'
services:
  elasticsearch:
    # 从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 ID,如果镜像不存在,Compose 会自动拉去镜像
    image: elasticsearch:7.17.1
    container_name: elasticsearch
    privileged: true
    user: root
    environment:
      # 设置集群名称为elasticsearch
      - cluster.name=elasticsearch 
      # 以单一节点模式启动
      - discovery.type=single-node 
      # 设置使用jvm内存大小
      - ES_JAVA_OPTS=-Xms512m -Xmx512m 
    volumes:
      # 插件文件挂载 
      - /home/pikaqiu/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins 
      # 数据文件挂载
      - /home/pikaqiu/elk/elasticsearch/data:/usr/share/elasticsearch/data 
    ports:
      - 9200:9200
      - 9300:9300

  logstash:
    image: logstash:7.17.1
    container_name: logstash
    # 
    ports:
       - 4560:4560
       - 4660:4660
    privileged: true
    environment:
      - TZ=Asia/Shanghai
    volumes:
      #挂载logstash的配置文件
      - /home/pikaqiu/elk/logstash/conf.d/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    depends_on:
      - elasticsearch 
    links:
      #可以用es这个域名访问elasticsearch服务
      - elasticsearch:es 

  kibana:
    image: kibana:7.17.1
    container_name: kibana
    ports:
        - 5601:5601
    privileged: true
    links:
      #可以用es这个域名访问elasticsearch服务
      - elasticsearch:es 
    depends_on:
      #kibana在elatiscsearch启动之后再启动
      - elasticsearch 
    environment:
      # 设置访问elasticsearch的地址
      - elasticsearch.hosts=http://elasticsearch:9200
    volumes:
      - /home/pikaqiu/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml

3.1.2 docker-compose inicia elk

La estructura completa del directorio es la siguiente:

pikaqiu@pikaqiu-virtual-machine:~/elk$ ll
-rw-rw-r--  1 pikaqiu pikaqiu 1525 427 15:16 docker-compose.yml
drwxrwxr-x  4 pikaqiu pikaqiu 4096 422 14:33 elasticsearch/
drwxrwxr-x  2 pikaqiu pikaqiu 4096 424 20:21 images/
drwxrwxr-x  3 pikaqiu pikaqiu 4096 422 14:33 kibana/
drwxrwxr-x  3 pikaqiu pikaqiu 4096 422 14:39 logstash/

Construya e inicie el contenedor ELK:

cd /home/pikaqiu/elk
docker-compose up -d

Si se produce un error durante el inicio, deberá cerrar y eliminar el contenedor antes de reiniciarlo. Cierre el comando de eliminación:

docker-compose down

3.2 Construcción del proyecto SpringBoot

Aquí se preparan dos microservicios para simular múltiples escenarios de microservicios.

3.2.1 Microservicio 1 (elk_test)

1. Estructura de ingeniería
imagen.png

  1. archivo pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.6.7</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.pikaqiu</groupId>
	<artifactId>elk_test</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>net.logstash.logback</groupId>
			<artifactId>logstash-logback-encoder</artifactId>
			<version>5.3</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>
  1. logback-primavera.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <!--应用名称-->
    <property name="APP_NAME" value="springboot-logback-elk1-test"/>
    <contextName>${APP_NAME}</contextName>
    <!--输出到logstash的appender-->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--可以访问的logstash日志收集端口-->
        <destination>192.168.88.158:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>


    <root level="info">
        <appender-ref ref="LOGSTASH"/>
    </root>

</configuration>
  1. propiedades.de.aplicación
server.port=8080
  1. TestController.java
package com.pikaqiu.controller;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    
    

    private Logger logger = (Logger)LogManager.getLogger(this.getClass());

    @RequestMapping("/index1")
    public void testElk(){
    
    
        logger.debug("======================= elk1 test ================");
        logger.info("======================= elk1 test ================");
        logger.warn("======================= elk1 test ================");
        logger.error("======================= elk1 test ================");
    }

}

3.2.2 Microservicio 1 (elk_test2)

1. Estructura de ingeniería
imagen.png

  1. archivo pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.6.7</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.pikaqiu</groupId>
	<artifactId>elk_test2</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>net.logstash.logback</groupId>
			<artifactId>logstash-logback-encoder</artifactId>
			<version>5.3</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>
  1. logback-primavera.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <!--应用名称-->
    <property name="APP_NAME" value="springboot-logback-elk2-test"/>
    <!--输出到logstash的appender-->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--可以访问的logstash日志收集端口-->
        <destination>192.168.88.158:4660</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>

    <root level="info">
        <appender-ref ref="LOGSTASH"/>
    </root>

</configuration>
  1. propiedades.de.aplicación
server.port=8081
  1. TestController.java
package com.pikaqiu.controller;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    
    

    private Logger logger = (Logger)LogManager.getLogger(this.getClass());

    @RequestMapping("/index2")
    public void testElk(){
    
    
        logger.debug("======================= elk2 test ================");
        logger.info("======================= elk2 test ================");
        logger.warn("======================= elk2 test ================");
        logger.error("======================= elk2 test ================");
    }

}

Nota: Los puertos de recopilación de registros logstash correspondientes en los archivos logback-spring.xml del microservicio 1 y el microservicio 2 son diferentes, y el server.port correspondiente en application.properties es diferente.

3.3 configuración de kibana

  1. Ingrese http://192.168.88.158:5601/app/home para acceder a la interfaz web de Kibana. Haga clic en Configuración a la izquierda para ingresar a la interfaz de administración

imagen.png

  1. Seleccione el modo de índice y haga clic en Crear modo de índice.

imagen.png

  1. Complete los campos de nombre y marca de tiempo y cree el esquema de índice

imagen.png
imagen.png

  1. Seleccione Descubrir y podrá ver los dos modos de índice recién creados.

imagen.png
imagen.png

  1. Seleccione el modo de índice elk1-*, puede ver el registro generado por el microservicio 1

imagen.png

  1. Seleccione el modo de índice elk2-* para ver los registros generados por el microservicio 2

imagen.png

referencia:

  1. https://www.laobaiblog.top/2022/03/30/docker-compose%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2elk%E5%B9%B6% E9%9B%86%E6%88%90springboot/
  2. https://blog.csdn.net/weixin_43184769/article/details/84971532


Supongo que te gusta

Origin blog.csdn.net/hansome_hong/article/details/124585026
Recomendado
Clasificación