Personalización de 1.6.x Agente de registro para admitir el análisis sintáctico multilínea personalizado para las aplicaciones Node.js que utilizan Winston en entornos orquestados

Este tutorial muestra cómo configurar la gestión de registros multilínea de IBM® Cloud Logs Agente de registro para una aplicación Node.js utilizando la biblioteca de registros Winston personalizada. Esta configuración es para entornos orquestados, por ejemplo IBM Cloud Kubernetes Service y Red Hat OpenShift on IBM Cloud, y utiliza Helm. Esta configuración garantiza que las trazas de pila y los registros multilínea se agrupen correctamente en IBM Cloud Logs.

Este tutorial requiere la versión IBM Cloud Logs Agente de registro 1.6.0 o posterior.

Antes de empezar

Antes de empezar a utilizar este tutorial, revise la siguiente información para comprender los conceptos de Agente de registro y multilínea.

Este tutorial también asume que usted tiene:

Ejemplo de configuración de Winston

Supongamos que su aplicación Node.js utiliza Winston y registra en la consola en el siguiente formato:

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp({
      format: 'ddd MMM DD YYYY HH:mm:ss.SSS'
    }),
    winston.format.errors({ stack: true }),
    winston.format.printf(({ timestamp, level, message, stack }) => {
      const levelUpper = level.toUpperCase();
      const baseLog = `[${timestamp}] ${levelUpper} [Main] - ${message}`;
      if (stack) {
        return `${baseLog}\n${stack}`;
      }
      return baseLog;
    })
  ),
  transports: [
    new winston.transports.Console()
  ]
});

Este formato produce entradas de registro que comienzan con una marca de tiempo y un nivel, y los registros de varias líneas, como las trazas de pila de errores, siguen en líneas posteriores sin marcas de tiempo.

Winston suele registrar toda la salida, incluidas las trazas de error, como una única cadena, por lo que no suele ser necesario un analizador multilínea. Sin embargo, este ejemplo demuestra qué hacer si su formateador imprime registros multilínea, y ayuda a ilustrar cómo enfocar el análisis multilínea para cualquier formato personalizado.

Esta configuración se proporciona como ejemplo para mostrar cómo manejar registros multilínea cuando se utiliza un formato de registro personalizado. Si su aplicación utiliza una estructura o biblioteca de registro diferente, utilice esto como referencia para crear su propio analizador multilínea en consecuencia.

Configuración del análisis sintáctico multilínea con Helm

Si despliega Agente de registro utilizando Helm, puede configurar el análisis sintáctico multilínea en el archivo Helm values.yaml.

Activar el análisis sintáctico multilínea

Establezca enableMultiline en true en su archivo values.yaml para activar el procesamiento multilínea:

enableMultiline: true

Definir el analizador sintáctico multilínea

Añada un analizador multilínea personalizado en la sección additionalMultilineParsers de su archivo values.yaml.

Es importante que el patrón definido en el archivo log4j.xml coincida con el regex del analizador multilínea para garantizar una agrupación correcta de los registros.

additionalMultilineParsers:
  - name: multiline-nodejs-winston
    type: regex
    flush_timeout: 500
    rules:
      - state: start_state
        regex: '/^\[[A-Z][a-z]{2} [A-Z][a-z]{2} \d{2} \d{4} \d{2}:\d{2}:\d{2}\.\d{3}\] .*$/'
        next_state: cont
      - state: cont
        regex: '/^(?!\[[A-Z][a-z]{2} [A-Z][a-z]{2} \d{2} \d{4} \d{2}:\d{2}:\d{2}\.\d{3}\] ).*$/'
        next_state: cont

La regex asume que cada nueva línea de registro comienza con una marca de tiempo en el formato ddd MMM DD YYYY HH:mm:ss.SSS. La primera regla captura las líneas de inicio con marcas de tiempo y pasa a un estado de continuación. La segunda regla coincide con cualquier línea que no empiece por una marca de tiempo.

Este enfoque es sólo un ejemplo para mostrarle cómo garantizar que las líneas de registro multilínea se agrupen como una única entrada de registro antes de reenviarlas a IBM Cloud Logs. Hay diferentes maneras de conseguir lo mismo.

Aplicar el analizador sintáctico en un preprocesador

Configure un preprocesador en la sección multilinePreprocessor para aplicar el analizador sintáctico a sus registros.

Por ejemplo:

multilinePreprocessor:
  - name: multiline
    multiline.parser: multiline-nodejs-winston
    multiline.key_content: log

Aplique los cambios.

Si ha instalado una versión anterior de Agente de registro y ha actualizado la configuración del agente modificando el mapa de configuración directamente en el clúster, haga una copia de su mapa de configuración desde el clúster antes de ejecutar el comando helm upgrade. Cuando se actualice Agente de registro, se sobrescribirá cualquier cambio realizado en el mapa de configuración.

Tras actualizar el archivo values.yaml, aplique los cambios ejecutando lo siguiente en su implantación. Esto regenerará las configuraciones necesarias.

helm upgrade

Verifique sus registros multilínea

Acceda a su instancia IBM Cloud Logs y confirme que sus entradas multilínea (por ejemplo, stack traces) están agrupadas correctamente.

  1. Acceda a su instancia IBM Cloud Logs.

  2. Uso del icono de registros Explorar registros y verifique que sus entradas de varias líneas estén agrupadas correctamente.