En este post, vamos a ver el funcionamiento de ELK orientado a la gestión de logs en una aplicación Java, y para ello usaremos la aplicación con Apache Camel que hemos visto otras veces.
ELK, es como se conoce a un conjunto de aplicaciones, concretamente a: Elasticsearch, Logstash y Kibana. Todas ellas son herramientas open source desarrolladas por Elastics. Las cuales permiten recoger datos de cualquier tipo de fuente y en cualquier formato para realizar búsquedas, análisis y visualización de los datos en tiempo real.
- Logstash es un pipeline de procesamiento de datos del servidor que consume datos de una multitud de diferentes fuentes y de forma simultanea. Estos datos son transformados y enviados a un repositorio de datos.
- Elasticsearch es un motor de búsqueda y análitica de los datos que tiene almacenados.
- Kibana nos permite crear gráficos y cuadros de mando para los usuarios, en base a la información que tenga Elasticsearch.
- Indicaremos una carpeta local como volumen del contenedor, que nos permitirá mantener la información aunque borremos el contenedor.
- Una red común a usar por los contendores.
- Los puertos expuestos: 9200 y 9300.
- Un healthcheck que compruebe si la instancia sigue funcionando correctamente. Para ello simplemente comprobaremos que en el puerto expuesto se obtiene una respuesta al invocarlo.
version: "3.7"
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
container_name: elasticsearch
hostname: elasticsearch
environment:
- node.name=elasticsearch
- cluster.name=es-docker-cluster
- discovery.type=single-node
volumes:
- ./data:/usr/share/elasticsearch/data
networks:
- elastic
ports:
- 9200:9200
- 9300:9300
healthcheck:
test: curl -s https://localhost:9200 >/dev/null; if [[ $$? == 52 ]]; then echo 0; else echo 1; fi
interval: 30s
timeout: 10s
retries: 5
networks:
elastic:
driver: bridge
kibana:
image: docker.elastic.co/kibana/kibana:7.10.2
container_name: kibana
hostname: kibana
volumes:
- ./config/kibana.yml:/usr/share/kibana/config/kibana.yml
ports:
- "5601:5601"
networks:
- elastic
depends_on:
- elasticsearch
server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
Para terminar la configuración de nuestro Docker Compose, ya solo nos quedaría configurar Logstash. Esta configuración será un poco más compleja y se compone de los siguientes apartados:
- Un volumen para indicarle el fichero en el cual configuraremos Logstash.
- Un volumen donde configuraremos los distintos pipelines que nos servirán como la entrada de los datos a ser enviados a Elasticsearch por Logstash.
- Un volumen que Logstash tenga acceso a los logs creados por la aplicación
- Los puertos que expone el servicio.
- La configuración de memoria de la JVM a utilizar.
logstash:
image: docker.elastic.co/logstash/logstash:7.10.2
container_name: logstash
hostname: logstash
volumes:
- ./config/logstash.yml:/usr/share/logstash/config/logstash.yml
- ./logstash/pipeline:/usr/share/logstash/pipeline - /home/dsblanco/Documentos/logs:/tmp
ports:
- "5044:5044"
- "5000:5000/tcp"
- "5000:5000/udp"
- "9600:9600"
environment:
LS_JAVA_OPTS: "-Xmx256m -Xms256m"
networks:
- elastic
depends_on:
- elasticsearch
El fichero logstash.yml nos permitirá configurar la herramienta. La cual no contendrá muchos valores, para este ejemplo. A igual que para Kibana, pondremos cual será nuestra IP y donde se encuentra Elasticsearch:
http.host: 0.0.0.0
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
En la carpeta pipeline se almacenarán diferentes ficheros de configuración que permitirán a Logstash gestionar diferentes fuentes de información y enviarlos a Elasticsearch. Estos ficheros se dividen en tres apartados:
- Input: Donde se indica cual va a ser el origen de los datos. Para nuestro caso serán los ficheros log generados por la aplicación. Aquelos que fueron montados en el volumen.
- Filter: Donde podremos si queremos realizar alguna operación de filtrado sobre los datos. Para nuestro ejemplo no realizaremos ninguno.
- Output: Donde indicamos el repositorio al que lo vamos a mandar. En esta caso Elasticsearch.
input {
file {
path => "/tmp/*.log"
codec => "json"
type => "camelELK"
}
}
output {
if [type]=="camelELK" {
elasticsearch {
hosts => [ "elasticsearch:9200" ]
index => "camelELK-%{+YYYY.MM.dd}"
}
}
}
Una vez que tenemos el Docker Compose configurado, podemos arrancarlo y comprobar que funciona de forma correcta al acceder a la ruta http://localhost:9200.
El siguiente paso será la configuración de nuestra aplicación. Lo más importante sobre esto es que usaremos logback. Y que a través de la clase de la clase LogstashEncoder se nos permitirá indicar ciertas caracteristicas. Como puede ser el formato de la salida, añadir campos personalizados o excluir determinados paquetes.
<configuration> <appender name="STASH" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/home/myUser/logs/apache_Camel_ELK.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>>/home/myUser/logs/apacheCamelELK.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>7</maxHistory> </rollingPolicy> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <customFields>{"appname":"Apache Camel ELK"}</customFields> </encoder> </appender> <root level="INFO"> <appender-ref ref="STASH" /> </root> </configuration>
Arrancaremos la aplicación y realizaremos varias consultas, por ejemplo a http://localhost:9090/book/1.
El siguiente paso será configurar Kibana para poder visualizar todos los datos. Para ello accedemos a http://localhost:5601/app/home. Una vez dentro tenemos que realizar dos pasos.
- Crear un indice
- Visualizar la información


No hay comentarios:
Publicar un comentario