2012-02-09 15 views
15

Sono un po 'confuso riguardo al formato del messaggio syslog. Devo scrivere un programma che analizzi i messaggi syslog. Quando ho letto ciò che ho nel mio esempio syslog-ng ricevo messaggi come questo:Confuso con il formato messaggio 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 

posso determinare chiaramente il vero messaggio (che è, in questo caso, un messaggio di log di accesso Apache) Il resto è metadati relativi il messaggio syslog stesso.

Tuttavia quando ho letto la RFC 5424 gli esempi di messaggi assomigliano:

senza dati strutturati

<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 dati strutturati

<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... 

Così ora sono un po 'confuso. Qual è il formato del messaggio syslog corretto? È una questione di versione spec in cui RFC 5424 obsoleto è RFC 3164 obsoleto?

risposta

17

Il problema in questo caso è che apache sta registrando tramite lo standard syslog (3) o via logger. Questo supporta solo il vecchio formato syslog (RFC3164), cioè non ci sono dati strutturati qui. Per avere i campi del log di apache come dati strutturati RFC5424, apache dovrebbe formattare il registro in questo modo.

Il primo esempio non è il syslog RFC3164 corretto, poiché il valore di priorità viene rimosso dall'intestazione. formato corretto RFC3164 sarebbe simile a questa:

<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 

Tradizionalmente RFC3164 messaggi syslog vengono salvati i file con il valore di priorità rimosso.

Gli altri due sono in formato RFC5424.

+0

Ok, quindi credo che sia normale vedere quasi tutti i messaggi di registro in formato RFC3164 anziché RFC5424 perché è lì da molto tempo. Il che significa anche che devo scrivere un parser che supporti entrambe le specifiche. Conosci qualche biblioteca (non importa la lingua) che già lo fa? – qwix

+0

Perché non utilizzare uno strumento esistente come syslog-ng, rsyslog o [nxlog] (http://nxlog.org)? (nota che sono affiliato a quest'ultimo). Se devi analizzare questo dal tuo programma, probabilmente sceglierei un linguaggio di scripting che possa facilmente gestire file di testo, come perl o python. – b0ti

+0

Ho bisogno di analizzare questi messaggi dal mio programma. Penso che userò Python. Ma per qualche ragione analizzare i messaggi di syslog non sembra così semplice come pensavo. Probabilmente perché ho bisogno di supportare due specifiche di differenza. Credo che sia il momento perfetto per iniziare a scrivere test unitari. Grazie per la tua risposta :) – qwix

1

Se si ha accesso al syslog-daemon installato sul sistema, è possibile configurarlo per scrivere i registri (ricevuti localmente o tramite rete) in un formato diverso. rsyslogd per esempio permette di configurare il proprio formato (basta scrivere un modello) e anche se ricordo che ha correttamente un modello incorporato da memorizzare in formato json. E ci sono biblioteche in quasi tutte le lingue per analizzare Json.

Problemi correlati