[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Logcheck et expression régulière



Bonsoir David, bonsoir tout le monde,

Le 2025-01-02 09:09, David BERCOT a écrit :

Ainsi, la forme de règle qu'on retrouve habituellement est la suivante :
^\w{3} [ :[:digit:]]{11} [-._[:alnum:]]+ systemd\[1\]: Started [-/:. [:alnum:]]+$
Et cela fonctionne bien pour, par exemple :
Jan  1 19:12:38 debian systemd[1]...
Maintenant, j'ai constaté que, selon les fichiers de logs, j'avais aussi :
Jan.  1
Janv. 1
Dec 31
Dec. 31
Déc 31

Je décompose tes exemples ainsi :

  • La ligne commence par le mois, indiqué sur 3 à 4 caractères
  • Suivi d'un point optionnel
  • Suivi de un espace
  • Suivi du jour du mois, calé ou non sur 2 caractères (et de l'heure), ce qui donne une suite de 10 à 11 chiffres, espaces et deux-points
  • Etc.

Si tu as bien ces variations, la bonne _expression_ rationnelle est :

^\w{3,4}\.? [ :[:digit:]]{10,11} [-._[:alnum:]]+ systemd\[[[:digit:]]+\]: .*$

Si on décompose :

  • ^\w{3,4} : La ligne commence par le mois, indiqué sur 3 à 4 caractères
  • \.? : Suivi d'un point optionnel
  •   : Suivi de un espace
  • [ :[:digit:]]{10,11} : Suivi du jour du mois, calé ou non sur 2 caractères (et de l'heure), ce qui donne une suite de 10 à 11 chiffres, espaces et deux-points
  • Etc.

Tu noteras que j'ai opté pour l'_expression_ :

systemd\[[[:digit:]]+\]:

Et non :

systemd\[1\]:

Car le PID du processus systemd n'est pas toujours 1. En fait, il y a plusieurs processus systemd. Voici ce que j'ai sur mon serveur :

$ ps axf | grep '/systemd ' | grep -v grep
      1 ?        Ss     1:36 /usr/lib/systemd/systemd --system --deserialize=116
4059223 ?        Ss     0:00 /usr/lib/systemd/systemd --user

Maintenant un exemple sur pièce :

Je crée le fichier de log avec les messages que je veux capturer :

$ cat > /tmp/log <<EOF
> Jan.  1 22:08:01 debian systemd[1]: Starting user@0.service - User Manager for UID 0...
> Janv. 1 22:08:01 debian systemd[4059223]: Queued start job for default target default.target.
> Dec 31 22:08:01 debian systemd[4059223]: Created slice app.slice - User Application Slice.
> Dec. 31 22:08:01 debian systemd[4059223]: Reached target paths.target - Paths.
> Déc 31 22:08:01 debian systemd[1]: Starting user@0.service - User Manager for UID 0...
> EOF

Puis je crée le fichier de règles :

$ cat > /tmp/rules <<EOF
> ^\w{3,4}\.? [ :[:digit:]]{10,11} [-._[:alnum:]]+ systemd\[[[:digit:]]+\]: .*$
> EOF

Puis je vérifie quels messages sont capturés par mes (enfin, ici, ma) règles :

$ logcheck-test -l /tmp/log -r /tmp/rules 
Jan.  1 22:08:01 debian systemd[1]: Starting user@0.service - User Manager for UID 0...
Janv. 1 22:08:01 debian systemd[4059223]: Queued start job for default target default.target.
Dec 31 22:08:01 debian systemd[4059223]: Created slice app.slice - User Application Slice.
Dec. 31 22:08:01 debian systemd[4059223]: Reached target paths.target - Paths.
Déc 31 22:08:01 debian systemd[1]: Starting user@0.service - User Manager for UID 0...
================================================================================
parsed file: /tmp/log
used rule file: /tmp/rules

Les 5 lignes sont bien capturées, ma règle fonctionne.

A++, Sébastien


--
Sébastien Dinot
Ne goutez pas au logiciel libre, vous ne pourriez plus vous en passer !
https://www.palabritudes.net/

Reply to: