2012-02-09 22 views
15

Estoy un poco confundido sobre el formato del mensaje syslog. Tengo que escribir un programa que analiza mensajes syslog. Cuando leo lo que me pasa en mi ejemplo syslog-ng recibo mensajes como éste:Confundido con el formato de mensaje syslog

Jan 12 06:30:00 1.2.3.4 apache_server: 1.2.3.4 - - [12/Jan/2011:06:29:59 +0100] "GET /foo/bar.html HTTP/1.1" 301 96 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 3.5.30729)" PID 18904 Time Taken 0 

puedo determinar con claridad el mensaje real (que es, en este caso un mensaje de registro de acceso de Apache) El resto es metadatos acerca el mensaje syslog en sí.

Sin embargo, cuando leí el RFC 5424 los ejemplos de mensajes se parecen:

sin datos estructurados

<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 - BOM'su root' failed for lonvick on /dev/pts/8 

o con datos estructurados

<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [[email protected] iut="3" eventSource="Application" eventID="1011"] BOMAn application event log entry... 

Así que ahora estoy un poco confundido. ¿Cuál es el formato de mensaje de syslog correcto? Es una cuestión de versión de la especificación donde RFC 5424 obsoleta RFC 3164?

Respuesta

17

El problema en este caso es que apache está registrando a través del syslog estándar (3) o mediante el registrador. Esto solo es compatible con el formato de syslog anterior (RFC3164), es decir, no hay datos estructurados aquí. Para que los campos del registro de apache aparezcan como datos estructurados RFC5424, apache deberá formatear el registro de esa manera.

El primer ejemplo no es el syslog apropiado de RFC3164, porque el valor de prioridad se elimina del encabezado. RFC3164 formato adecuado sería el siguiente:

<34>Jan 12 06:30:00 1.2.3.4 apache_server: 1.2.3.4 - - [12/Jan/2011:06:29:59 +0100] "GET /foo/bar.html HTTP/1.1" 301 96 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 3.5.30729)" PID 18904 Time Taken 0 

mensajes de registro del sistema Tradicionalmente RFC3164 se guardan en archivos con el valor de prioridad eliminado.

Los otros dos están en formato RFC5424.

+0

Ok, así que creo que es normal ver casi todos los mensajes de registro en formato RFC3164 en lugar de RFC5424 porque ha estado allí durante mucho tiempo. Lo que también significa que tengo que escribir un analizador que admita ambas especificaciones. ¿Conoces alguna biblioteca (sin importar el idioma) que ya haga esto? – qwix

+0

¿Por qué no utilizar una herramienta existente como syslog-ng, rsyslog o [nxlog] (http://nxlog.org)? (tenga en cuenta que estoy afiliado a este último). Si necesita analizar esto desde su propio programa, probablemente elegiría un lenguaje de scripting que pueda manejar fácilmente los archivos de texto, como perl o python. – b0ti

+0

Necesito analizar estos mensajes desde mi propio programa. Creo que voy a usar Python. Pero por alguna razón, el análisis de los mensajes de syslog no parece tan simple como pensaba. Probablemente porque necesito apoyar dos especificaciones de diferencia. Creo que es el momento perfecto para comenzar a escribir pruebas unitarias. Gracias por tu respuesta :) – qwix

1

Si tiene acceso al syslog-daemon instalado en el sistema, puede configurarlo para que escriba los registros (recibidos tanto localmente como a través de la red) en un formato diferente. rsyslogd, por ejemplo, permite configurar tu propio formato (solo escribe una plantilla) y también si recuerdo correctamente tiene una plantilla incorporada para almacenar en formato json. Y hay bibliotecas en casi cualquier idioma para analizar JSON.

Cuestiones relacionadas