C'est toujours bien l'égo boost, surtout quand ça laisse des traces sur l'interweb.

Alex

Le 7 février 2017 à 12:53, Yannick Cadin <yannick@diablotin.fr> a écrit :
Bon comme je constate que mon problème n'émeut personne, j'apporte moi-même la réponse :

Il y avait 2 soucis combinés (sans rapport direct l'un avec l'autre).

En premier, c'est posix par défaut jusqu'à la version 3.5 incluse de syslog-ng, pcre par défaut à partir de la version 3.6.

Ensuite et surtout, le motif (en premier paramètre de subst) doit impérativement être délimité par des apostrophes sans quoi les \ ne serviront qu'à banaliser le caractère qui les suit immédiatement et ne seront pas interprétés comme faisant partie de symboles PCRE.

OU ALORS, si l'on veut délimiter le motif avec des guillemets il faut alors doubler chaque \.

Exemple concret de ce que je voulais réaliser (et qui désormais fonctionne) :

rewrite remove_timestamp_in_docker_events {
    subst('(docker/\w+\[\d+]:) \d{4}-\d\d-\d\d \d\d:\d\d:\d\d,\d+', "$1", value("MESSAGE") type("pcre"));
};


S'il était avéré qu'une expression rationnelle POSIX soit plus rapide à traiter alors on peut opter pour l'une des variantes ci-dessous :

subst('(docker/[^[]+\[[0-9]+]:) [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]+', "$1", value("MESSAGE") type("posix"));

subst('(docker/[[:alnum:]]+\[[0-9]+]:) [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]+', "$1", value("MESSAGE") type("posix"));


Merci à moi (on n'est jamais aussi bien servi que par soi-même, surtout en guise d'auto-congratulations ;)

Yannick



Le 2017-02-06 22:12, Yannick Cadin a écrit :
Bonsoir,

On reste dans le traitement des logs.

J'appelle une commande subst dans un fichier syslog-ng.conf  (sur
Ubuntu 16.10 à jour)

Si le motif recherché est un littéral, ça marche très bien.
Si le motif recherché est une expression rationnelle au format POSIX,
ça marche très bien.
Si le motif recherché contient ne serait-ce qu'un symbole PCRE
(exemple \d ou \w) alors il N'y a PLUS AUCUNE correspondance trouvée.

Y compris si j'ajoute explicitement type("pcre"). Bien que ce soit
théoriquement superflu puisque c'est le "moteur" d'expressions
rationnelles que syslog-ng prétend employer par défaut.

J'ai, par acquis de conscience, lancer une commande ldd sur le binaire
syslog-ng qui m'a bien confirmé que le programme était lié avec la
librairie partagée libpcre.

Quasi impossible de trouver le moindre exemple d'emploi d'expressions
PCRE dans une config syslog-ng (soit je cherche mal, soit personne
n'emploie les expressions PCRE dans syslog-ng).

Auriez-vous une piste à me suggérer ? (Vous pouvez vous épargner la
solution consistant à se contenter des expressions POSIX, c'est ce que
j'adopterai en dernier recours.)

D'avance merci pour votre aide,

Yannick

_______________________________________________
Liste de diffusion du FRsAG
http://www.frsag.org/
_______________________________________________
Liste de diffusion du FRsAG
http://www.frsag.org/



--
Alexandre