¿Cómo leer logs de procesos desde Dataflow?

En este tutorial vamos a ver cómo podemos leer logs de distintos procesos, desde disco. Esto puede ser especialmente útil si, por ejemplo, queremos registrar determinadas trazas de log de los propios módulos de Plataforma como el propio Dataflow.

Requisitos

Como primer requisito, necesitamos que dichos logs sean accesibles por Dataflow, es decir, sean visibles desde algún FS a nivel local por Dataflow. En este ejemplo leeremos los propios logs de la herramienta Dataflow.

Lo siguiente que necesitamos saber es dónde se almacenan los logs de la aplicación y cómo rotan. Para nuestro ejemplo los logs se ubican en “/logs/” siguiendo un rotado por volumen, donde el antiguo fichero rota al siguiente número empujando a los antiguos de la siguiente manera:

  1. sdc.log (actual)

  2. sdc.log.1 (siguiente más reciente)

  3. sdc.log.2

  4. sdc.log.n (más antiguo)

Desarrollo

Sabiendo todo esto, empezamos a crear nuestro Dataflow con el nodo origen “Tail”.

Este origen lee del conjunto de ficheros de un directorio que le configuremos. Es importante como decíamos en la sección anterior, ajustar el tipo de rotado de los logs, para que el origen sepa procesarlos correctamente.

El nodo tiene dos salidas:

  1. Salida de datos: Cada una de las líneas de logs

  2. Salida de metadata: Contiene otra información de cómo se van leyendo los datos entre los ficheros. En este ejemplo no es relevante, con lo que la descartamos enviándola a “Trash”.

image-20240826-115617.png

Como se ve en la imagen, es fundamental especificar que la nomenclatura a seguir es la seleccionada en el campo “Naming”. Para el ejemplo es de nombres con sufijos numéricos inversos, donde el fichero activo es el indicado en el campo “Path”.

También tenemos que configurar cómo va a leer el origen. En la pestala “Data Format” seleccionaremos tipo de dato leido y cómo leerlo.

image-20240826-120023.png

Lo habitual es leer texto, salvo que se sepa que es un formato más elaborado o standard. Si leemos de esta manera, lo normal es leer línea a línea, por lo que debemos indicar la longitud máxima a tener en cuenta (campo “Max line length”). Pasado ese valor, el registro será truncado y se indicará en el propio resultado, en el campo “truncated” con valor “true” en el registro:

Una vez configurada la lectura de los datos es importante que se filtre por los datos que se quieran almacenar. Cuando leemos logs es importante prever o limitar de alguna manera la cantidad de datos que vamos a insertar en las entidades. Si sabemos que la rotación es muy alta, es posible que llenemos el almacén de datos de la entidad si no filtramos adecuadamente.

En este ejemplo solo queremos quedarnos con las trazas que sean de ERROR. Para ello podemos usar el nodo “Stream selector” añadiendo las condiciones que tengan que cumplir nuestros registros finales a almacenar:

Aquí filtraremos lo que cumplen ser de traza “ERROR”.

Lo siguiente es dar formato a la línea de texto del log para poder almacenarla en una entidad. Supongamos que la entidad destino tiene los campos siguientes:

  • Timestamp: Timestamp completo

  • Day: Año, mes y día

  • Time: Hora del timestamp

  • text: Dato en crudo del log

Aquí tenemos total libertad para parsear los datos como queramos. Para este ejemplo usaremos el nodo “Expression evaluator” que permite definir nuevos campos de manera muy sencilla con expresiones y funciones de todo tipo (String, fechas, numéricos, …):

Y se pueden ver los datos filtrados y parseados:

 

Por último, configuramos el nodo ”OnesaitPlatform Destination” para que haga uso de un Digital Client definido sobre Plataforma y que tenga permisos de escritura sobre la entidad destino que elijamos.

Es importante como decíamos anteriormente, que los datos generados en el proceso estén acorde al schema de la entidad.