En esta página se pretende identificar los distintos tipos de log que podemos encontrar en los index-pattern de cada aplicación FundeWebJS en LAGAR, así como describir cada campo para poder conocer en profundidad la estructura de dichos logs.
Además, se enumerará el listado de objetos predeterminados (consultas, visualizaciones y paneles) que se proporciona desde MNCS cuando se realiza el alta de la aplicación en LAGAR.
Por último se explicará cómo loggear en nuestro backend java para que aparezcan en LAGAR automáticamente nuevos campos por los que poder consultar y filtrar de manera más ágil y eficiente.
Lo primero que hay que mencionar a la hora de hablar de los logs en FundeWebJS es que nuestras aplicaciones pueden tener parte front en VUE (servicio UI) y parte backend en Java/Spring Boot (servicio API).
Esto implica que tenemos dos servidores web diferentes (uno para la parte UI y otro para API) que están mandando logs al mismo index-pattern de nuestra aplicacion en LAGAR.
Un index-pattern en LAGAR es la colección de todos los índices de nuestra aplicación en un mismo entorno. Por ejemplo, si tenemos un index-pattern k8s-consultaexp-ns-desa@*, este index-pattern contendrá todos los logs de la aplicación "Consulta de Expedientes" en el entorno de desarrollo.
Dicho esto, podemos distinguir los siguientes tipos de log.
Logs de peticiones HTTP (Accesslog). El típico log access de apache que podemos encontrar en nuestras aplicaciones FundeWeb normales. Por ejemplo: Fichero accesslog de Portalfundeweb.
155.54.228.21 - - [07/Jun/2021:17:32:55 +0000] "GET /consultaexpedientes/rest/v1.0/private/titulaciones/XXXXXXX HTTP/1.1" 200 769 "https://micampusdesa.um.es/consulta/expedienteacademico/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36" "155.54.67.188" 340 |
Logs del backend Java/Spring-Boot (Log4j2). El log java habitual de nuestros servicios en la parte API, configurados como se indica en la página: 12. Logs en Spring Boot.
Pensando en su equivalente FundeWeb, el habitual fichero log application de nuestra aplicación.
{
"line_number": 377,
"class": "es.um.atica.consultaexpedientesbackend.rest.RestExpedientes",
"@version": 1,
"source_host": "consultaexp-api-deployment-desa-5499587c9f-kx8gs",
"message": " ############################################### titulaciones: XXXXXXX",
"thread_name": "http-nio-8080-exec-10",
"_@timestamp": "2021-06-07T17:32:54.983+00:00",
"level": "INFO",
"file": "RestExpedientes.java",
"method": "getTitulaciones",
"logger_name": "es.um.atica.consultaexpedientesbackend.rest.RestExpedientes"
} |
Tanto UI como API mandan a LAGAR logs de tipo Accesslog. Solo API manda a LAGAR logs de tipo Log4j2. |
En cada registro de LAGAR para aplicaciones FundeWebJS tenemos dos campos que nos indicarán rápidamente el tipo de log con el que estamos trabajando:
Con la combinación de estos campos podemos saber el tipo de log y el servicio que lo está generando.
Ejemplo: "Quiero ver todos los logs de mi servicio en el backend java"
=> Desde LAGAR - Discover, seleccionamos nuestro index-pattern y establecemos el filtro kubernetes.log.type: kube_apli.
Ejemplo 2: "Quiero ver todos los logs de peticiones HTTP al front VUE"
=> Desde LAGAR - Discover, seleccionamos nuestro index-pattern y establecemos los filtros kubernetes.log.type: kube_acces_log y kubernetes.container_name: ui.
Desde MNCS se proporcionan varias consultas guardadas donde están configurados filtros sobre estos campos. Se mostrarán en el apartado 2 de esta página.
Efectivamente, los logs de aplicaciones FundeWebJS se almacenan en LAGAR como un gran documento JSON.
Este JSON contiene, de forma encapsulada, el log de la aplicación/accesslog, los metadatos de Kubernetes y los metadatos de Elastic.
Esta es la estructura desglosada de cada evento de log en LAGAR según su tipo:
{
"_index": "k8s-consultaexp-ns-desa@2021.23",
"_type": "_doc",
"_id": "MvlS7HkBt6ITkvetuPXP",
"_version": 1,
"_score": null,
"_source": {
"source": {
"ip": "155.54.67.188"
},
"user": {
"email": "-"
},
"time": "2021-06-08T15:51:53.627305882Z",
"kubernetes": {
"labels": {
"author": "campusvirtual",
"app": "api",
"pod-template-hash": "5499587c9f"
},
"namespace_name": "consultaexp-ns-desa",
"host": "155.54.228.21",
"docker_id": "ebf5e81608c2d6b3bd25f16c81b9931ac6810595086c6ea1e9fbf880cf74d5d2",
"pod_id": "48733f4e-9f95-40ae-a560-373154829bc8",
"log": {
"type": "kube_acces_log"
},
"container_name": "api",
"annotations": {
"cni.projectcalico.org/podIP": "10.42.148.90/32",
"field.cattle.io/ports": "[[{\"containerPort\":8080,\"dnsName\":\"consultaexp-api-deployment-desa\",\"kind\":\"ClusterIP\",\"name\":\"8080tcp2\",\"protocol\":\"TCP\"}]]",
"cattle.io/timestamp": "2021-02-04T12:09:09Z",
"cni.projectcalico.org/podIPs": "10.42.148.90/32",
"field.cattle.io/publicEndpoints": "[{\"addresses\":[\"155.54.228.21\",\"155.54.228.22\",\"155.54.228.23\"],\"hostname\":\"micampusdesa.um.es\",\"ingressId\":\"consultaexp-ns-desa:consultaexp-api-ingress-desa\",\"path\":\"/consulta/expedienteacademico\",\"port\":80,\"protocol\":\"HTTP\",\"serviceId\":\"consultaexp-ns-desa:consultaexp-api-service-desa\"}]"
},
"container_hash": "registry.um.es:443/mncs/consulta-expedientes-api@sha256:53d5dc41868a6dc36523c8c75d0ae9372b2c4d38729256ac0ce0d96348a7acd8",
"container_image": "registry.um.es:443/mncs/consulta-expedientes-api:0.0.540570",
"pod_name": "consultaexp-api-deployment-desa-5499587c9f-kx8gs"
},
"http": {
"access": {
"time": "08/Jun/2021:15:51:53 +0000"
},
"response": {
"status_code": "200",
"body": {
"bytes": "769",
"delay": "292"
}
},
"request": {
"method": "GET",
"referer": "https://micampusdesa.um.es/consulta/expedienteacademico/"
},
"user_agent": {
"original": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
},
"version": "1.1"
},
"@timestamp": "2021-06-08T15:51:53.000Z",
"log": "10.42.49.192 - - [08/Jun/2021:15:51:53 +0000] \"GET /consultaexpedientes/rest/v1.0/private/titulaciones/XXXXXX HTTP/1.1\" 200 769 \"https://micampusdesa.um.es/consulta/expedienteacademico/\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36\" \"155.54.67.188\" 292\n",
"message": "{\"_@timestamp\":1623167513.627306,\"log\":\"10.42.49.192 - - [08/Jun/2021:15:51:53 +0000] \\\"GET /consultaexpedientes/rest/v1.0/private/titulaciones/23274740 HTTP/1.1\\\" 200 769 \\\"https://micampusdesa.um.es/consulta/expedienteacademico/\\\" \\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36\\\" \\\"155.54.67.188\\\" 292\\n\",\"stream\":\"stdout\",\"time\":\"2021-06-08T15:51:53.627305882Z\",\"kubernetes\":{\"pod_name\":\"consultaexp-api-deployment-desa-5499587c9f-kx8gs\",\"namespace_name\":\"consultaexp-ns-desa\",\"pod_id\":\"48733f4e-9f95-40ae-a560-373154829bc8\",\"labels\":{\"app\":\"api\",\"author\":\"campusvirtual\",\"pod-template-hash\":\"5499587c9f\"},\"annotations\":{\"cattle.io/timestamp\":\"2021-02-04T12:09:09Z\",\"cni.projectcalico.org/podIP\":\"10.42.148.90/32\",\"cni.projectcalico.org/podIPs\":\"10.42.148.90/32\",\"field.cattle.io/ports\":\"[[{\\\"containerPort\\\":8080,\\\"dnsName\\\":\\\"consultaexp-api-deployment-desa\\\",\\\"kind\\\":\\\"ClusterIP\\\",\\\"name\\\":\\\"8080tcp2\\\",\\\"protocol\\\":\\\"TCP\\\"}]]\",\"field.cattle.io/publicEndpoints\":\"[{\\\"addresses\\\":[\\\"155.54.228.21\\\",\\\"155.54.228.22\\\",\\\"155.54.228.23\\\"],\\\"hostname\\\":\\\"micampusdesa.um.es\\\",\\\"ingressId\\\":\\\"consultaexp-ns-desa:consultaexp-api-ingress-desa\\\",\\\"path\\\":\\\"/consulta/expedienteacademico\\\",\\\"port\\\":80,\\\"protocol\\\":\\\"HTTP\\\",\\\"serviceId\\\":\\\"consultaexp-ns-desa:consultaexp-api-service-desa\\\"}]\"},\"host\":\"155.54.228.21\",\"container_name\":\"api\",\"docker_id\":\"ebf5e81608c2d6b3bd25f16c81b9931ac6810595086c6ea1e9fbf880cf74d5d2\",\"container_hash\":\"registry.um.es:443/mncs/consulta-expedientes-api@sha256:53d5dc41868a6dc36523c8c75d0ae9372b2c4d38729256ac0ce0d96348a7acd8\",\"container_image\":\"registry.um.es:443/mncs/consulta-expedientes-api:0.0.540570\"}}",
"stream": "stdout",
"@version": "1",
"url": {
"path": "/consultaexpedientes/rest/v1.0/private/titulaciones/XXXXXX"
},
"geoip": {
"country_code3": "ES",
"ip": "155.54.67.188",
"timezone": "Europe/Madrid",
"latitude": 37.987,
"region_name": "Murcia",
"country_name": "Spain",
"location": {
"lon": -1.13,
"lat": 37.987
},
"country_code2": "ES",
"city_name": "Murcia",
"postal_code": "30001",
"longitude": -1.13,
"region_code": "MU",
"continent_code": "EU"
},
"cluster": {
"ip": "10.42.49.192"
}
},
"fields": {
"@timestamp": [
"2021-06-08T15:51:53.000Z"
],
"kubernetes.annotations.cattle.io/timestamp": [
"2021-02-04T12:09:09.000Z"
],
"time": [
"2021-06-08T15:51:53.627Z"
]
},
"highlight": {
"kubernetes.log.type.keyword": [
"@kibana-highlighted-field@kube_acces_log@/kibana-highlighted-field@"
]
},
"sort": [
1623167513000
]
} |
{
"_index": "k8s-consultaexp-ns-desa@2021.23",
"_type": "_doc",
"_id": "wBBS7HkBrJTgiCWTs8ib",
"_version": 1,
"_score": null,
"_source": {
"tags": [
"_grokparsefailure",
"_geoip_lookup_failure"
],
"@version": "1",
"time": "2021-06-08T15:51:53.335846939Z",
"kubernetes": {
"labels": {
"author": "campusvirtual",
"app": "api",
"pod-template-hash": "5499587c9f"
},
"namespace_name": "consultaexp-ns-desa",
"host": "155.54.228.21",
"docker_id": "ebf5e81608c2d6b3bd25f16c81b9931ac6810595086c6ea1e9fbf880cf74d5d2",
"pod_id": "48733f4e-9f95-40ae-a560-373154829bc8",
"log": {
"type": "kube_apli"
},
"container_name": "api",
"annotations": {
"cni.projectcalico.org/podIP": "10.42.148.90/32",
"field.cattle.io/ports": "[[{\"containerPort\":8080,\"dnsName\":\"consultaexp-api-deployment-desa\",\"kind\":\"ClusterIP\",\"name\":\"8080tcp2\",\"protocol\":\"TCP\"}]]",
"cattle.io/timestamp": "2021-02-04T12:09:09Z",
"cni.projectcalico.org/podIPs": "10.42.148.90/32",
"field.cattle.io/publicEndpoints": "[{\"addresses\":[\"155.54.228.21\",\"155.54.228.22\",\"155.54.228.23\"],\"hostname\":\"micampusdesa.um.es\",\"ingressId\":\"consultaexp-ns-desa:consultaexp-api-ingress-desa\",\"path\":\"/consulta/expedienteacademico\",\"port\":80,\"protocol\":\"HTTP\",\"serviceId\":\"consultaexp-ns-desa:consultaexp-api-service-desa\"}]"
},
"container_hash": "registry.um.es:443/mncs/consulta-expedientes-api@sha256:53d5dc41868a6dc36523c8c75d0ae9372b2c4d38729256ac0ce0d96348a7acd8",
"container_image": "registry.um.es:443/mncs/consulta-expedientes-api:0.0.540570",
"pod_name": "consultaexp-api-deployment-desa-5499587c9f-kx8gs"
},
"@timestamp": "2021-06-08T15:51:53.335Z",
"log": "{\"line_number\":377,\"class\":\"es.um.atica.consultaexpedientesbackend.rest.RestExpedientes\",\"@version\":1,\"source_host\":\"consultaexp-api-deployment-desa-5499587c9f-kx8gs\",\"message\":\" ############################################### titulaciones: XXXXX\",\"thread_name\":\"http-nio-8080-exec-6\",\"_@timestamp\":\"2021-06-08T15:51:53.335+00:00\",\"level\":\"INFO\",\"file\":\"RestExpedientes.java\",\"method\":\"getTitulaciones\",\"logger_name\":\"es.um.atica.consultaexpedientesbackend.rest.RestExpedientes\"}\n",
"log_processed": {
"class": "es.um.atica.consultaexpedientesbackend.rest.RestExpedientes",
"level": "INFO",
"_@timestamp": "2021-06-08T15:51:53.335+00:00",
"message": " ############################################### titulaciones: XXXXX",
"file": "RestExpedientes.java",
"method": "getTitulaciones",
"@version": 1,
"logger_name": "es.um.atica.consultaexpedientesbackend.rest.RestExpedientes",
"thread_name": "http-nio-8080-exec-6",
"line_number": 377,
"source_host": "consultaexp-api-deployment-desa-5499587c9f-kx8gs"
},
"message": "{\"_@timestamp\":1623167513.335847,\"log\":\"{\\\"line_number\\\":377,\\\"class\\\":\\\"es.um.atica.consultaexpedientesbackend.rest.RestExpedientes\\\",\\\"@version\\\":1,\\\"source_host\\\":\\\"consultaexp-api-deployment-desa-5499587c9f-kx8gs\\\",\\\"message\\\":\\\" ############################################### titulaciones: XXXXX\\\",\\\"thread_name\\\":\\\"http-nio-8080-exec-6\\\",\\\"_@timestamp\\\":\\\"2021-06-08T15:51:53.335+00:00\\\",\\\"level\\\":\\\"INFO\\\",\\\"file\\\":\\\"RestExpedientes.java\\\",\\\"method\\\":\\\"getTitulaciones\\\",\\\"logger_name\\\":\\\"es.um.atica.consultaexpedientesbackend.rest.RestExpedientes\\\"}\\n\",\"stream\":\"stdout\",\"time\":\"2021-06-08T15:51:53.335846939Z\",\"log_processed\":{\"line_number\":377,\"class\":\"es.um.atica.consultaexpedientesbackend.rest.RestExpedientes\",\"@version\":1,\"source_host\":\"consultaexp-api-deployment-desa-5499587c9f-kx8gs\",\"message\":\" ############################################### titulaciones: XXXXX\",\"thread_name\":\"http-nio-8080-exec-6\",\"_@timestamp\":\"2021-06-08T15:51:53.335+00:00\",\"level\":\"INFO\",\"file\":\"RestExpedientes.java\",\"method\":\"getTitulaciones\",\"logger_name\":\"es.um.atica.consultaexpedientesbackend.rest.RestExpedientes\"},\"kubernetes\":{\"pod_name\":\"consultaexp-api-deployment-desa-5499587c9f-kx8gs\",\"namespace_name\":\"consultaexp-ns-desa\",\"pod_id\":\"48733f4e-9f95-40ae-a560-373154829bc8\",\"labels\":{\"app\":\"api\",\"author\":\"campusvirtual\",\"pod-template-hash\":\"5499587c9f\"},\"annotations\":{\"cattle.io/timestamp\":\"2021-02-04T12:09:09Z\",\"cni.projectcalico.org/podIP\":\"10.42.148.90/32\",\"cni.projectcalico.org/podIPs\":\"10.42.148.90/32\",\"field.cattle.io/ports\":\"[[{\\\"containerPort\\\":8080,\\\"dnsName\\\":\\\"consultaexp-api-deployment-desa\\\",\\\"kind\\\":\\\"ClusterIP\\\",\\\"name\\\":\\\"8080tcp2\\\",\\\"protocol\\\":\\\"TCP\\\"}]]\",\"field.cattle.io/publicEndpoints\":\"[{\\\"addresses\\\":[\\\"155.54.228.21\\\",\\\"155.54.228.22\\\",\\\"155.54.228.23\\\"],\\\"hostname\\\":\\\"micampusdesa.um.es\\\",\\\"ingressId\\\":\\\"consultaexp-ns-desa:consultaexp-api-ingress-desa\\\",\\\"path\\\":\\\"/consulta/expedienteacademico\\\",\\\"port\\\":80,\\\"protocol\\\":\\\"HTTP\\\",\\\"serviceId\\\":\\\"consultaexp-ns-desa:consultaexp-api-service-desa\\\"}]\"},\"host\":\"155.54.228.21\",\"container_name\":\"api\",\"docker_id\":\"ebf5e81608c2d6b3bd25f16c81b9931ac6810595086c6ea1e9fbf880cf74d5d2\",\"container_hash\":\"registry.um.es:443/mncs/consulta-expedientes-api@sha256:53d5dc41868a6dc36523c8c75d0ae9372b2c4d38729256ac0ce0d96348a7acd8\",\"container_image\":\"registry.um.es:443/mncs/consulta-expedientes-api:0.0.540570\"}}",
"stream": "stdout"
},
"fields": {
"@timestamp": [
"2021-06-08T15:51:53.335Z"
],
"kubernetes.annotations.cattle.io/timestamp": [
"2021-02-04T12:09:09.000Z"
],
"time": [
"2021-06-08T15:51:53.335Z"
],
"log_processed._@timestamp": [
"2021-06-08T15:51:53.335Z"
]
},
"highlight": {
"kubernetes.log.type": [
"@kibana-highlighted-field@kube_apli@/kibana-highlighted-field@"
],
"kubernetes.container_name.keyword": [
"@kibana-highlighted-field@api@/kibana-highlighted-field@"
]
},
"sort": [
1623167513335
]
} |
Y en la siguiente tabla de referencia podemos ver los distintos campos que nos encontramos en los eventos, su tipo, cuándo nos los podemos encontrar y qué información contienen:
| CAMPO | TIPO CAMPO | TIPO LOG | DESCRIPCIÓN |
|---|---|---|---|
@timestamp | Metadato Elastic | Todos | |
| @version | Metadato Elastic | Todos | |
_id | Metadato Elastic | Todos | |
| _index | Metadato Elastic | Todos | |
| _score | Metadato Elastic | Todos | |
| _type | Metadato Elastic | Todos | |
| kubernetes.annotations.cattle.io/timestamp | Metadato Kubernetes | Todos | |
| kubernetes.annotations.cni.projectcalico.org/podIP | Metadato Kubernetes | Todos | |
| kubernetes.annotations.cni.projectcalico.org/podIPs | Metadato Kubernetes | Todos | |
| kubernetes.annotations.field.cattle.io/ports | Metadato Kubernetes | Todos | |
| kubernetes.annotations.field.cattle.io/publicEndpoints | Metadato Kubernetes | Todos | |
| kubernetes.container_hash | Metadato Kubernetes | Todos | |
| kubernetes.container_image | Metadato Kubernetes | Todos | |
| kubernetes.container_name | Metadato Kubernetes | Todos | |
| kubernetes.docker_id | Metadato Kubernetes | Todos | |
| kubernetes.host | Metadato Kubernetes | Todos | |
| kubernetes.labels.app | Metadato Kubernetes | Todos | |
| kubernetes.labels.author | Metadato Kubernetes | Todos | |
| kubernetes.labels.pod-template-hash | Metadato Kubernetes | Todos | |
| kubernetes.log.type | Metadato Kubernetes | Todos | |
| kubernetes.namespace_name | Metadato Kubernetes | Todos | |
| kubernetes.pod_id | Metadato Kubernetes | Todos | |
| kubernetes.pod_name | Metadato Kubernetes | Todos | |
| log | Campo General | Todos |
|
| log_processed.@version | Log4j2 | API |
|
| log_processed._@timestamp | Log4j2 | API | Extraído del campo log para eventos tipo log4j2. |
| log_processed.class | Log4j2 | API | Extraído del campo log para eventos tipo log4j2. |
| log_processed.file | Log4j2 | API | Extraído del campo log para eventos tipo log4j2. |
| log_processed.level | Log4j2 | API | Extraído del campo log para eventos tipo log4j2. |
| log_processed.line_number | Log4j2 | API | Extraído del campo log para eventos tipo log4j2. |
| log_processed.logger_name | Log4j2 | API | Extraído del campo log para eventos tipo log4j2. |
| log_processed.message | Log4j2 | API | parámetro al log.[level](message). Extraído del campo log para eventos tipo log4j2. |
| log_processed.method | Log4j2 | API | Extraído del campo log para eventos tipo log4j2. |
| log_processed.source_host | Log4j2 | API | Extraído del campo log para eventos tipo log4j2. |
| log_processed.thread_name | Log4j2 | API | Extraído del campo log para eventos tipo log4j2. |
| message | Campo General | Todos |
|
| cluster.ip | Acesslog | API+UI | |
| source.ip | Acesslog | API+UI | Extraído del campo log para eventos tipo accesslog. |
| geoip.[CAMPO_X] | Acesslog | API+UI |
|
| http.access.time | Acesslog | API+UI | Extraído del campo log para eventos tipo accesslog. |
| http.request.method | Acesslog | API+UI | Extraído del campo log para eventos tipo accesslog. |
| http.request.referer | Acesslog | API+UI | Extraído del campo log para eventos tipo accesslog. |
| http.response.body.bytes | Acesslog | API+UI |
|
| http.response.body.delay | Acesslog | API |
|
| http.response.status_code | Acesslog | API+UI | Extraído del campo log para eventos tipo accesslog. |
| http.user_agent.original | Acesslog | API+UI | (Familia de navegador, información del sistema, plataforma, extensiones...) Extraído del campo log para eventos tipo accesslog. |
| http.version | Acesslog | API+UI | |
| stream | Metadato Elastic | Todos | |
| tags | Metadato Elastic | Todos | Proporciona información sobre el parseo en Logstash. |
| time | Metadato Elastic | Todos | |
| log_processed.mdc.[CAMPO_CUSTOM] | Log4j2 | API |
|
Campo importante.
Campo útil, interesante para generar determinadas gráficas.
Campo con metainformación. Irrelevante para desarrollo en la mayoría de los casos.
También puede ser conveniente usar paneles visuales para comunicar información relacionada, sugerencias o aspectos que los usuarios deban tener en cuenta. |
Aquí aparecen artículos relacionados sobre la base de las etiquetas que usted seleccione. Haga clic para editar la macro y añadir o modificar las etiquetas.
|
TIPOS DE LOGS EN LAGAR SEGÚN ORIGEN
