Directorio de artículos
1. Introducción a ELK
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: entradas → filtros → salida . 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 4月 27 15:16 docker-compose.yml
drwxrwxr-x 4 pikaqiu pikaqiu 4096 4月 22 14:33 elasticsearch/
drwxrwxr-x 2 pikaqiu pikaqiu 4096 4月 24 20:21 images/
drwxrwxr-x 3 pikaqiu pikaqiu 4096 4月 22 14:33 kibana/
drwxrwxr-x 3 pikaqiu pikaqiu 4096 4月 22 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
- 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>
- 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>
- propiedades.de.aplicación
server.port=8080
- 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
- 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>
- 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>
- propiedades.de.aplicación
server.port=8081
- 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
- 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
- Seleccione el modo de índice y haga clic en Crear modo de índice.
- Complete los campos de nombre y marca de tiempo y cree el esquema de índice
- Seleccione Descubrir y podrá ver los dos modos de índice recién creados.
- Seleccione el modo de índice elk1-*, puede ver el registro generado por el microservicio 1
- Seleccione el modo de índice elk2-* para ver los registros generados por el microservicio 2
referencia: