Versiones comparadas
Clave
- Se ha añadido esta línea.
- Se ha eliminado esta línea.
- El formato se ha cambiado.
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.
| Tabla de contenidos | ||||
|---|---|---|---|---|
|
Charla LAGAR y Visualización de Logs de FundeWebJS al grupo GACADE: https://umurcia.zoom.us/rec/share/GiQHsFLWYNUwgG4JBfMy2t8g76xIQRTlOOf37-ArlXu_cVyzWttoF32oqdWB58yu.mzkusD9RLAyMpfq7 Passcode: zr&X4m4M
1. Descripción de LOGS
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
| Tooltip | ||||
|---|---|---|---|---|
| ||||
Un índice de Elasticsearch es una colección de documentos relacionados entre sí. |
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.
Tipos de LOGS
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.
Bloque de código language text title Ejemplo Accesslog 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:
Pensando en su equivalente FundeWeb, el habitual fichero log application de nuestra aplicación.Bloque de código language json title Ejemplo log backend java { "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" }
| Info |
|---|
Tanto UI como API mandan a LAGAR logs de tipo |
Accesslog. Solo API manda a LAGAR logs de tipo Log4j2. |
-"Vale, pero ¿cómo se yo de qué tipo es cada log de forma rápida?"
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:
- kubernetes.log.type: Tiene los valores:
- kube_apli => El log es de tipo Log4j2 (backend java)
- kube_acces_log => El log es una petición HTTP (acesslog)
- kubernetes.container_name: Tiene los valores:
- api => El log proviene del servicio API
- ui => El log proviene del servicio UI
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.
-"Vale, pero cada log tiene mucha información ¿cómo sé yo a qué corresponde cada campo?"
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:
| Bloque de código | ||||||||
|---|---|---|---|---|---|---|---|---|
| ||||||||
{
"_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
]
} |
| Bloque de código | ||||||||
|---|---|---|---|---|---|---|---|---|
| ||||||||
{
"_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:
TABLA DE REFERENCIA DE CAMPOS
Campo importante.
Campo útil, interesante para generar determinadas gráficas.
Campo con metainformación. Irrelevante para desarrollo en la mayoría de los casos.
| 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 logpara eventos tipo log4j2. |
| log_processed.class | Log4j2 | API | Extraído del campo logpara eventos tipo log4j2. |
| log_processed.file | Log4j2 | API | Extraído del campo logpara eventos tipo log4j2. |
| log_processed.level | Log4j2 | API | Extraído del campo logpara eventos tipo log4j2. |
| log_processed.line_number | Log4j2 | API | Extraído del campo logpara eventos tipo log4j2. |
| log_processed.logger_name | Log4j2 | API | Extraído del campo logpara eventos tipo log4j2. |
| log_processed.message | Log4j2 | API | Extraído del campo logpara eventos tipo log4j2. |
| log_processed.method | Log4j2 | API | Extraído del campo logpara eventos tipo log4j2. |
| log_processed.source_host | Log4j2 | API | Extraído del campo logpara eventos tipo log4j2. |
| log_processed.thread_name | Log4j2 | API | Extraído del campo logpara eventos tipo log4j2. |
| log_processed.exception.exception_class | Log4j2 | API | Por ejemplo: java.lang.IllegalArgumentException |
| log_processed.exception.exception_message | Log4j2 | API | Por ejemplo: JWT String argument cannot be null or empty. |
| log_processed.exception.stacktrace | Log4j2 | API | |
| 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 | |
| url.path | Acesslog | API+UI | |
| user.email | 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.
2. Objetos predeterminados en LAGAR
En el proceso de alta de aplicaciones FundeWebJS, desde MNCS proporcionamos una serie de objetos en KIBANA (interfaz gráfica de LAGAR), con el fin de proporcionar una herramienta útil para la visualización de logs desde el primer momento, suavizar la curva de aprendizaje de la interfaz y servir de modelo en la creación de objetos propios.
Estos objetos en Kibana pueden ser de los siguientes tipos:
- Consultas (Saved Searches) - Equivalente a los filtros de Jira.
- Gráficas (Visualizations) - Equivalente a los gadgets de Jira.
- Paneles de control (Dashboards) - Equivalente a los cuadros de mando de Jira.
Los objetos proporcionados para cada aplicación FundeWebJS son:
| NOMBRE OBJETO | TIPO OBJETO | ENTORNO | DESCRIPCIÓN |
|---|---|---|---|
| [XXXX][DESA] Accesslog API+UI | Search | Desarrollo | Consulta preparada con filtros y columnas para visualizar las peticiones HTTP accesslog en API y UI de forma conjunta. |
| [XXXX][TEST] Accesslog API+UI | Search | Preproducción | Consulta preparada con filtros y columnas para visualizar las peticiones HTTP accesslog en API y UI de forma conjunta. |
| [XXXX] Accesslog API+UI | Search | Producción | Consulta preparada con filtros y columnas para visualizar las peticiones HTTP accesslog en API y UI de forma conjunta. |
| [XXXX][DESA] Logs application | Search | Desarrollo | Consulta preparada con filtros y columnas para visualizar los logs de nuestros servicios java en API. |
| [XXXX][TEST] Logs application | Search | Preproducción | Consulta preparada con filtros y columnas para visualizar los logs de nuestros servicios java en API. |
| [XXXX] Logs application | Search | Producción | Consulta preparada con filtros y columnas para visualizar los logs de nuestros servicios java en API. |
| [XXXX] Errores application | Search | Producción | Consulta preparada con filtros y columnas para visualizar los logs con nivel de traza ERROR de nuestros servicios java en API. |
| [XXXX] Dashboard - Kubernetes | Dashboard | Producción | Panel para monitorizar eventos y visualizar gráficas de logs agrupadas por PODs e imagenes. |
| [XXXX] Dashboard - ACCESS | Dashboard | Producción | Panel para monitorizar peticiones HTTP a nuestra aplicación y visualizar gráficas agrupadas por códigos de respuesta HTTP, User-agents, paths más consultados, tamaños y retrasos acumulados en las respuestas, IPs que generan más peticiones y mapa para geolocalizarlas. |
| [XXXX] Dashboard - BACKEND | Dashboard | Producción | Panel para monitorizar el estado del backend Java, resolución de incidencias y visualización de gráficas agrupadas por niveles de traza y clases java y visualización cómoda de trazas de excepción. |
3. Añadir campos a LAGAR desde el backend JAVA
En este apartado se va a explicar el mecanismo de logging para crear campos en LAGAR de forma automática a partir de un ejemplo.
Supongamos que tenemos un parámetro muy usado en nuestros servicios, y que nos vendría bien tenerlo en LAGAR como campo para filtrar de forma ágil y realizar gráficas con agrupaciones por ese campo. Por ejemplo, el dni de un alumno, un correo, un token, etc.
Podemos crearnos una constante en nuestra clase del servicio:
| Bloque de código | ||
|---|---|---|
| ||
private static final String MDC_DNI_ALUMNO = "dniAlumno"; |
Y luego en nuestros servicios hacer uso de la clase org.jboss.logging.MDC.
Esta clase tiene dos métodos, put(key, value) y remove(key), que introducen pares clave-valor en un mapa de contexto que Log4j2 es capaz de leer.
Siguiendo con el ejemplo, podemos tener el siguiente servicio:
| Bloque de código | ||||||||
|---|---|---|---|---|---|---|---|---|
| ||||||||
/**
* Devuelve la lista de titulaciones correspondientes al dni
*
* @param dni
* @return List<AlumnoTitulacionDTO>
*/
@GetMapping( "/titulaciones/{dni}" )
public ResponseEntity<List<AlumnoTitulacionDTO>> getTitulaciones( @PathVariable( required = true ) String dni ) {
try {
MDC.put( MDC_DNI_ALUMNO, dni );
log.info( " Llamada a getTitulaciones" );
final List<AlumnoTitulacionDTO> listaDto = new ArrayList<>();
for ( final AlumnoTitulacion alumnoTitulacion : alumnoTitulacionRepository.findAllBySivaId( dni ) ) {
listaDto.add( new AlumnoTitulacionDTO( alumnoTitulacion ) );
}
log.info( "Obtenidas {} titulaciones", listaDto.size() );
return new ResponseEntity<>( listaDto, HttpStatus.OK );
} catch ( final Exception e ) {
log.error( e.getLocalizedMessage() );
throw new ResponseStatusException( HttpStatus.INTERNAL_SERVER_ERROR, "Ocurrió un error inesperado", e );
} finally {
MDC.remove( MDC_DNI_ALUMNO );
}
} |
Con la línea "MDC.put( MDC_DNI_ALUMNO, dni );" introducimos el par clave-valor en el mapa.
Con la línea "MDC.remove( MDC_DNI_ALUMNO );" eliminamos la clave del mapa.
Todos los logs que escribamos entre estas dos instrucciones contendrán en LAGAR un campo log_processed.mdc.dniAlumno con el valor de la variable "dni" por el que podremos usar para filtrar y agrupar.
| Advertencia |
|---|
ES OBLIGATORIO BORRAR LAS CLAVES INTRODUCIDAS PREVIAMENTE USANDO EL MÉTODO MDC.remove. |
| Advertencia |
|---|
Este mecanismo debe usarse con moderación. |
| Info |
|---|
Para poder realizar agrupaciones en gráficas, es necesario refrescar el index-pattern para que el campo aparezca con el tipo de dato correcto. Consultar con MNCS. |
- cómo identificarlos
- describir campos kubernetes
- describir campos access
- describir campos backend
2. Objetos predeterminados en LAGAR
- consultas desa
- consultas test
- consultas prod
- panel k8s
- panel backend
- panel access
3. Añadir campos automáticamente
infoArtículos Relacionados
| Contenido por etiqueta | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| Propiedades de página | ||
|---|---|---|
| ||
|
Image RemovedTipos de Log en LAGAR según origenTIPOS DE LOGS EN LAGAR SEGÚN ORIGEN
Image Added