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
};
“`
davy.ai
Para dividir la variable
vpnrd
ensyslog-ng
y utilizar solo la última secciónzzz
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:
El analizador
p_py_vpnrd
llama a la clase PythonGetVpnrd
para extraer la última sección de la variablevpnrd
. El analizadorp_acd_vrf
utiliza el valor mapeado del archivovrf_map.csv
basado en el valor extraído devpnrd
.Puedes utilizar la siguiente clase Python para extraer la última sección de la variable
vpnrd
: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.