J'ai une application Ruby sur mon serveur, appelons-la "alpha". L'application émet des messages syslog avec le nom de programme "alpha". Je veux séparer mes messages de log dans des fichiers distincts en fonction du type de message, par exemple les messages "auth" (connexions) ou les avertissements concernant les ressources du système.
Je n'ai aucun moyen de spécifier le "type de message" à syslog autre que le nom de mon programme, donc j'ajoute simplement "AUTH :", "SYSTEM :" etc. au début de mon message.
En utilisant Google et les pages de manuel, j'ai trouvé les conditions suivantes :
:programname,isequal,"alpha" /var/log/alpha.log
Cela permet d'enregistrer tous les messages de l'application "alpha" dans le bon fichier journal.
:msg,startswith," AUTH:" /var/log/alpha-auth.log
Cela permet d'enregistrer tous les messages commençant par "AUTH :" dans le bon fichier journal.
Il est évident que la dernière condition ne s'applique pas seulement à "alpha", mais à tous les messages. J'aimerais combiner ces conditions en une seule qui dirait "tous les messages d'alpha qui commencent par AUTH : ...". Est-il possible de combiner des filtres avec des "et" comme cela ?
Les "blocs de type BSD" semblent parfaits, car je peux définir un bloc pour mon application et toutes les conditions ne s'appliquent qu'aux messages de cette application. Malheureusement, d'après la documentation, cette fonctionnalité n'est plus prise en charge (obsolète ?), et je ne veux pas dépendre d'une fonctionnalité obsolète. Est-ce que rsyslog v7+ introduit une alternative à ces blocs ?
En utilisant un filtre basé sur l'expression, j'ai réussi à obtenir le résultat souhaité, mais j'ai l'impression d'utiliser un bazooka pour tuer une mouche :
if $programname == "alpha" and $msg startswith " AUTH:" then \
/var/log/alpha-auth.log
Quelle serait la manière "correcte" (c'est-à-dire la plus simple et la moins sujette à erreur) de procéder ?
J'utilise Debian Jessie, ce qui signifie actuellement rsyslog 8.4.2.