Extrayendo valores de csv-parser en syslog-ng

Extrayendo valores de csv-parser en syslog-ng

Syslog-ng ingiere una fuente syslog en formato csv usando el analizador csv y la escribe en el disco.

Según tengo entendido, se supone que el uso del csv-parser proporciona contexto syslog-ng a los datos que ingresan y qué valor significa qué. Me gustaría usar ese contexto para hacer que syslog-ng aplique filtros basados ​​en esa lógica.

Por ejemplo, me gustaría que solo registre un evento en el disco si una de las columnas csv coincide con un valor específico.

El analizador csvdocumentaciónparece sugerir que esto debería ser posible.

Mi configuración se parece un poco a:

parser p_my_app {
    csv-parser(
        columns("MY_APP.COLOUR","MY_APP.SIZE","MY_APP.SERIAL_NUMBER")
        delimiters(",")
        flags(escape-double-char)
    );
};

source s_my_app {
    syslog(ip(0.0.0.0) port(6514)
        transport("tcp")
    );
}; 

filter f_my_app { 
    match("123456" value("MY_APP.SERIAL_NUMBER") );
};

destination d_my_app { 
    file("/var/log/my_app.log"
        create_dirs(yes)
    ); 
};

log { 
    source(s_my_app);
    filter(f_my_app);
    parser(p_my_app);
    destination(d_my_app); 
};

Sin embargo, parece que por mucho que lo intente, la combinación nunca coincide. Aquí está el resultado de depuración de sylog-ng con esa configuración:

Incoming log entry; line='<14>1 2017-01-18T17:46:38+11:00 hostname  - - - red,large,123456
'
Filter rule evaluation begins; rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'
Filter node evaluation result; result='not-match'
Filter rule evaluation result; result='not-match', rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'

(¿Espero?) Me estoy perdiendo algo realmente obvio, pero no puedo encontrar ningún ejemplo completo en línea después de horas de buscar en Google, solo extractos que nunca parecen funcionar. ¿Alguien puede ver lo que estoy haciendo mal y/o proporcionar un ejemplo funcional completo?

Respuesta1

Bueno, como parece ser siempre, dedico una semana a un problema, me rindo, decido buscar ayuda y luego encuentro la solución yo mismo una hora más tarde.

Mi problema fue el orden de los elementos del log()extracto. En concreto, la parser()líneaDEBEestar antes de la filter()declaración.

De hecho, eldocumentación(que debí haber leído 10 veces y haberme perdido) afirma que:

Nota El orden de los filtros, las reglas de reescritura y los analizadores en la declaración de registro es importante, ya que se procesan de forma secuencial.

Entonces, el código de trabajo es usar:

log { 
    source(s_my_app);
    parser(p_my_app);
    filter(f_my_app);
    destination(d_my_app); 
};

Además, otra cosa a tener en cuenta es que match()en realidad se supone que es una expresión regular, por lo que para mayor claridad, también actualicé el filtro a:

filter f_my_app { 
    match("123456" value("MY_APP.SERIAL_NUMBER") type("string"));
};

Con syslog-ng ahora informando:

Incoming log entry; line='<14>1 2017-01-18T17:46:38+11:00 hostname  - - - red,large,123456
'
Message parsing complete; result='1', rule='p_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:14:2'
Filter rule evaluation begins; rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'
Filter node evaluation result; result='match'
Filter rule evaluation result; result='match', rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'

información relacionada