Je suis un peu confus au sujet du format de message syslog. Je dois écrire un programme qui analyse les messages Syslog. Lorsque je lis ce que j'obtiens dans mon instance syslog-ng, je reçois des messages comme celui-ci:
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
Je peux clairement déterminer le vrai message (qui est, dans ce cas, un message de journal d'accès Apache). Le reste est constitué de métadonnées sur le message syslog lui-même.
Cependant, quand je lis le RFC 5424 les exemples de messages ressemblent à ceci:
sans données structurées
<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 - BOM'su root' failed for lonvick on /dev/pts/8
ou avec des données structurées
<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"] BOMAn application event log entry...
Alors maintenant, je suis un peu confus. Quel est le format de message syslog correct? C'est une question de version de spécification où RFC 5424 obsolète RFC 3164 ?
Le problème dans ce cas est qu'Apache se connecte via le syslog standard (3) ou via l'enregistreur. Cela ne prend en charge que l'ancien format syslog (RFC3164), c'est-à-dire qu'il n'y a pas de données structurées ici. Pour que les champs du journal Apache s'affichent en tant que données structurées RFC5424, Apache devrait formater le journal de cette façon.
Le premier exemple n'est pas un syslog RFC3164 correct, car la valeur de priorité est supprimée de l'en-tête. Le format RFC3164 correct ressemblerait à ceci:
<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
Traditionnellement, les messages Syslog rfc3164 sont enregistrés dans des fichiers avec la valeur de priorité supprimée.
Les deux autres sont au format RFC5424.
Si vous avez accès au démon syslog installé sur le système, vous pouvez le configurer pour écrire les journaux (reçus localement ou via le réseau) dans un format différent. rsyslogd, par exemple, permet de configurer votre propre format (il suffit d'écrire un modèle) et, si je me souviens bien, a un modèle intégré à stocker au format json. Et il existe des bibliothèques dans presque toutes les langues pour analyser json.