Tips, Soluciones y Novedades en Tecnología

04/06/2023

Enviar Logs desde Spring Boot a Logstash


La gestión de logs en proyecto java, normalmente se registran en archivos según la configuración va generando historial con el tiempo.

Para tener disponible mediante acceso web a los logs del servidor, una buena practica es gestionar con herramientas especializadas y segun nuestras necesidades explotar esos logs con el obetivo de entender mejor que esta pasando en el funcionamiento de nuestra aplicación

En este Post veremos como configurar la librería Logback que permite enviar logs desde un proyecto Spring Boot al servidor LogStash, y este podrá enviar a un servidor ElasticSearch u otro segun necesidad.

Agregamos la dependencia maven al proyecto

<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.6</version>
</dependency>

Configuración de Logback junto al archivo de application.yml de spring

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property resource="application.yml" />
    <springProperty scope="context" name="logstash" source="logging.logstash.url"/>
    <springProperty scope="context" name="loglevel" source="logging.level.root"/>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>${logstash}</destination>
        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <mdc />
                <context />
                <logLevel />
                <loggerName />
                <pattern>
                    <pattern>
                        {
                        "app": "myapp"
                        }
                    </pattern>
                </pattern>
                <threadName />
                <message />
                <logstashMarkers />
                <stackTrace />
            </providers>
        </encoder>
    </appender>
    <logger level="${loglevel}">
        <appender-ref ref="logstash"/>
    </logger>
    <root level="${loglevel}">
        <appender-ref ref="logstash"/>
    </root>
</configuration>

Ahora configuramos el archivo application.yml del proyecto de Spring.

# Configuración de Logs
logging:
  file:
    name: /opt/apps/myapp.log
    max-size: 10MB
    max-history: 30
    clean-history-on-start: true
  logstash:
    url: logstash.mydominio.com:5000
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n"
  level:
    root: INFO
    org.springframework.web: INFO

Como se puede apreciar, en la secion "logging" se define file y logstash, esto permitirá escribir los logs en disco y enviar a logstash al mismo tiempo.

Ahora vamos a ver el contenido del archivo de configuración de logstash que estará escuchando en el puerto 5000, esperando que logback envie los logs desde spring boot.

Crear el archivo apps.conf en /etc/logstash/conf.d

input {
  tcp {
        port => "5000"
        codec => json_lines
    }
}
filter {
}
output {
  elasticsearch {
    hosts => ["https://localhost:9200"]
    user => "logstash"
    password => "123456789"
    cacert => "/etc/logstash/certs/http_ca.crt"
    ssl => true
    ssl_certificate_verification => false
    index => "miempresa-apps-%{+YYYY.MM.dd}"
  }
}

El codigo de la configuración de logstash decepciona el log, no aplica filtro y envía a elasticsearch para su indexación y su posterior visualización desde Kibana, similar a la imagen siguiente.



Saludos.




0 comments:

Publicar un comentario