es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mapeo de valores de syslog-ng para sub-cadenas de variables.

Estoy ejecutando syslog-ng en el contenedor balabit/syslog-ng:3.35.1

Me gustaría hacer un mapeo de valores para el valor en la variable vpnrd

A continuación se muestra la configuración para el mapeo de valores + ejemplo de archivo CSV


parser p_json { json-parser(prefix(".json.")); }; parser p<em>acd</em>vrf { add-contextual-data( selector("${.json.vpnrd}") database("vrf<em>map.csv") default-selector("UNKNOWN") prefix(".meta</em>vrf.") ); };

Contenido del archivo CSV:
csv
111,vrf_id,vrf_1
222,vrf_id,vrf_2
zzz,vrf_id,vrf_example
UNKNOWN,vrf_id,[No VRF; Global Instance peer]
...

El problema es que vpnrd contiene una cadena en formato xxx:yyy:zzz y necesito dividirla (usando el delimitador :) y utilizar solo la última sección zzz porque solo esa parte es relevante para el mapeo de valores.

¿Existe alguna manera de hacerlo en syslog-ng?

Estuve buscando un analizador personalizado en Python donde sería fácil realizar este tipo de operación, pero luego no sé cómo conectar el resultado del analizador en Python con el analizador de mapeo de valores.

Gracias por cualquier ayuda


Actualización: escribí un analizador en Python basado en este blog, pero desafortunadamente el mapeo aún no funciona y siempre obtengo [No VRF; Global Instance peer], que se asigna como valor predeterminado.
Tampoco puedo ver los registros desde el script de Python (¿a dónde se envían?), así que es difícil solucionar el problema

“`python
parser p<em>py</em>vrf_id {
python(
class("GetVrfId")
);
};

python {
from syslogng import Logger
logger = Logger()
class GetVrfId(object):
def parse(self, log<em>message):
"""
extraer el id de vrf de la variable rd
"""
logger.info(f'log: {log<em>message}')
try:
vpnrd = log</em>message['.json.rd'].split(':')[-1].strip()
log<em>message['.json.vpnrd'] = vpnrd
logger.info(f'vpnrd: {vpnrd}')
except KeyError:
log</em>message['.json.vpnrd'] = 'UNKNOWN'
logger.error(f'key-error: rd not present')
except Exception as e:
logger.error(f'catch-all-error: {e}')
# return True, other way message is dropped
return True
};
“`

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para dividir la variable vpnrd en syslog-ng y utilizar solo la última sección zzz para el mapeo de valores, puedes usar un analizador de Python personalizado.

    Aquí tienes un ejemplo de configuración utilizando un analizador de Python personalizado:

    parser p_py_vpnrd {
      python(
        class("GetVpnrd")
      );
    };
    
    parser p_acd_vrf {
      add-contextual-data(
        selector("${.json.vpnrd}")
        database("vrf_map.csv")
        default-selector("UNKNOWN")
        prefix(".meta_vrf.")
      );
    };
    

    El analizador p_py_vpnrd llama a la clase Python GetVpnrd para extraer la última sección de la variable vpnrd. El analizador p_acd_vrf utiliza el valor mapeado del archivo vrf_map.csv basado en el valor extraído de vpnrd.

    Puedes utilizar la siguiente clase Python para extraer la última sección de la variable vpnrd:

    parser p_py_vpnrd {
      python(
        class("GetVpnrd")
      );
    };
    
    python {
      from syslogng import Logger
    
      logger = Logger()
    
      class GetVpnrd(object):
        def parse(self, log_message):
          """
          Extrae la última sección de la variable vpnrd
          """
          try:
            vpnrd = log_message[".json.vpnrd"].split(":")[-1].strip()
            log_message[".json.vpnrd"] = vpnrd
            logger.info(f"vpnrd: {vpnrd}")
          except KeyError:
            log_message[".json.vpnrd"] = "UNKNOWN"
            logger.error("key-error: vpnrd no está presente")
          except Exception as e:
            logger.error(f"catch-all-error: {e}")
          return True
      };
    

    Asegúrate de configurar la clase Python en el archivo de configuración de syslog-ng y habilitar el soporte de Python en syslog-ng. Además, comprueba la ubicación del archivo vrf_map.csv y asegúrate de que sea accesible desde el contenedor.

    Si tienes algún problema con la configuración, verifica los registros de syslog-ng en busca de errores o consulta la documentación de syslog-ng para obtener más información.

Comments are closed.