Estoy buscando una forma mejor/más nueva de enviar registros de la aplicación Spring Boot directamente al servidor de Elasticsearch sin usar Filebeats o Logstash. ¿Cómo puedo hacer eso? ¿Existe una forma simple/moderna en Spring Boot o usando alguna biblioteca buena/reputada para lograrlo?
Lo que necesito es enviar registros directamente desde Spring Boot a Elasticsearch sin ningún servicio intermedio como Logstash. Si es una biblioteca de terceros que puede agregar a pom.xml y si lo está haciendo completamente, está bien. Necesito la propia aplicación Spring para manejar esto. He revisado algunas preguntas similares en Stack Overflow.
Pero algunas bibliotecas están obsoletas ahora y otras no se actualizan durante mucho tiempo. Me gustaría saber acerca de una nueva biblioteca o una forma de hacer esto ahora. Básicamente, lo que está escribiendo en la consola debe enviarse a Elasticsearch.
Puede incluir la biblioteca logback-elastic-appender en su pom.xml y usar la clase com.internetitem.logback.elasticsearch.ElasticsearchAppender incluida como appender en la configuración de registro en el archivo logback.xml
<dependency> <groupId>com.internetitem</groupId> <artifactId>logback-elasticsearch-appender</artifactId> <version>1.6</version> </dependency> ¿Es esa una de las bibliotecas que no quería usar porque no se ha actualizado recientemente? Si es así, puede escribir un agregador personalizado y señalarlo en el archivo logback.xml . Una implementación simple del appender podría verse a continuación:
package com.example.demo; import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.springframework.web.reactive.function.client.WebClient; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; import reactor.core.publisher.Mono; public class ElasticSearchAppender extends AppenderBase<ILoggingEvent> { private static final String ELASTIC_SEARCH_API_HOST = "http://localhost:9200"; private static final String ELASTIC_SEARCH_INDEX_NAME = "dummy-index"; private static final WebClient webClient = WebClient.create(ELASTIC_SEARCH_API_HOST); private static final Logger LOGGER = Logger.getLogger(ElasticSearchAppender.class.getName()); public static final DateTimeFormatter ISO_8601_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX") .withZone(ZoneId.systemDefault()); @Override protected void append(ILoggingEvent eventObject) { Map<String, Object> loggingEvent = new LinkedHashMap<>(); loggingEvent.put("@timestamp", ISO_8601_FORMAT.format(Instant.ofEpochMilli(eventObject.getTimeStamp()))); loggingEvent.put("message", eventObject.getMessage()); // Add additional fields like MDC webClient.post() .uri("/{logIndex}/_doc", ELASTIC_SEARCH_INDEX_NAME) .bodyValue(loggingEvent) .retrieve() .bodyToMono(Void.class) .onErrorResume(exception -> { LOGGER.log(Level.SEVERE, "Unable to send log to elastic", exception); return Mono.empty(); }) .subscribe(); } }inicio de sesión.xml:
<configuration> <appender name="ELASTIC" class="com.example.demo.ElasticSearchAppender" /> <root level="INFO"> <appender-ref ref="ELASTIC"/> </root> </configuration>Puede usar el REGISTRO que proporciona Spring boot:
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; private static final Logger LOGGER = LogManager.getLogger(yourClass.class); LOGGER.info("PRINT THIS OUT");Esto debería aparecer en un archivo llamado "Mensajes" en frijoles mágicos elásticos.
Esto proviene de la dependencia spring-boot-starter-web.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>Cree su propio servidor Elastic de hospedaje, agregue elastic.jar al proyecto y agregue configuraciones de Elastic a su Dockerfile :
java -javaagent:elastic-apm-agent-1.0.jar \ -Delastic.apm.service_name=project_name \ -Delastic.apm.server_urls=http://elastic_server_url \ -Delastic.apm.secret_token= \ -Delastic.apm.environment=$ACTIVE_PROFILE \ -Delastic.apm.application_packages=package_name \