4859 links
  • GuiGui's Show

  • Home
  • Login
  • RSS Feed
  • Tag cloud
  • Picture wall
  • Daily
Links per page: 20 50 100
page 1 / 1
  • rsyslog : syntaxes et méthodologie de diagnostic

    Syntaxes

    Je galère toujours un peu avec les trouzemilles syntaxes de rsyslog (démon de journalisation), donc je prends quelques notes.



    Fil rouge :

    • Présentation :
      • rsyslog version 8 sur Debian GNU/Linux 10 ;

      • Il reçoit des flux syslog depuis des équipements réseaux ;
    • Consignes :
      • Consigner séparemment des messages syslog provenant de deux programmes qui tournent sur deux machines (machine1 et machine2). Grouper par nom de programme ;

      • Le chemin + le nom du fichier journal doivent être de la forme /var/log/distant/<ANNÉE>/<MOIS>/<JOUR>/bidule/programme1.log et /var/log/distant/<ANNÉE>/<MOIS>/<JOUR>/bidule/programme2.log. On veut un nom compréhensible, pas le vrai nom du programme.



    Au début, je récupère un bout de conf' existant sur notre rsyslog :

    $template chemin-prog1, "/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme1.log"
    
    +machine1
    *.*     -?chemin-prog1
    +machine2
    *.*     -?chemin-prog1

    Ce bout de code ne valide pas la deuxième consigne de notre fil rouge, mais c'est pour commencer.
    Sauf qu'un redémarrage de rsyslog crache « BSD-style blocks are no longer supported in rsyslog ». Game over.



    Tentons une autre syntaxe :

    $template chemin-prog1, "/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme1.log"
    :programname, isequal, "prog1" -?chemin-prog1

    Ça fonctionne, mais pas vraiment : « - » n'a plus l'effet escompté, le message syslog est consigné dans programme1.log et dans /var/log/syslog, ce qui n'est pas ce que nous voulons (/var/log/distant n'est pas un montage NFS pour rien).



    Utilisons une syntaxe qui enchaîne plusieurs actions :

    $template chemin-prog1, "/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme1.log"
    :programname, isequal, "prog1" -?chemin-prog1
    & stop

    Je rappelle que la syntaxe « & ~ » n'est plus prise en charge depuis plusieurs années. ;)

    Cela fonctionne.

    Mais j'aimerai vraiment trier aussi en fonction du nom d'hôte renseigné dans le message syslog.
    Objectif : si un jour j'utilise le même programme sur d'autres machines et que leur journal est envoyé sur ce serveur de journalisation, je ne voudrai pas forcément mélanger cette nouvelle machine aux existantes (usage différent, journal différent, par exemple).



    Utilisons un peu la """"nouvelle"""" syntaxe (RainerScript) :

    $template chemin-prog1, "/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme1.log"
    if $programname == 'prog1' and $hostname == 'machine1' then ?chemin-prog1
    & stop

    Ça fonctionne, mais ça va devenir illisible car il faut une ligne par couple { nom d'hôte ; nom de programme }. Deux hôtes + deux programmes = 4 lignes. (En vrai, il faut deux lignes par couple, l'instruction et « stop ».)



    Factorisons :

    $template chemin-prog1, "/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme1.log"
    $template chemin-prog2, "/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme2.log"
    
    if $hostname == 'machine1' or $hostname == 'machine2' then {
        if $programname == 'prog1' then ?chemin-prog1
        & stop
    
        if $programname == 'prog2' then ?chemin-prog2
        & stop
    }

    Ben voilàààà ! :)



    Et si l'on utilisait un peu plus la """"nouvelle"""" syntaxe ?

    template (name="chemin-prog1"  type="string" string="/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme1.log")
    template (name="chemin-prog2"  type="string" string="/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme2.log")
    
    if $hostname == 'machine1' or $hostname == 'machine2' then {
        if $programname == 'prog1' then {
            action(type="omfile" dynaFile="chemin-prog1")
            stop
        }
    
        if $programname == 'prog2' then {
            action(type="omfile" dynaFile="chemin-prog2")
            stop
        }
    }



    ÉDIT DU 02/05/2022 À 23 H 35 : j'ai rédigé un autre shaarli sur le changement de mode / propriétaire / groupe d'un fichier journal avec rsyslog (ça s'applique aussi à une arborescence de stockage des journaux).

    Et encore un autre sur l'envoi de journaux à un serveur syslog avec un client rsyslog. FIN DE L'ÉDIT.


    Méthodologie de diagnostic

    Si l'on fait du syslog distant, vérifier que le flux arrive sur le serveur de journalisation avec tcpdump -n port 514 + vérifier que le flux syslog n'est pas bloqué par un pare-feu local (tcpdump sur le serveur de journalisation se place avant le Netfilter du même serveur ;) ).

    Vérifier que l'on utilise les bonnes propriétés pour travailler sur le flux syslog. Coquille classique : « $fromhost » != « $hostname ». La première contient le nom d'hôte de l'émetteur syslog tel que le serveur syslog l'a résolu à partir de l'IP source des paquets syslog qu'il reçoit. La deuxième est le nom d'hôte tel que l'émetteur syslog l'a consigné dans le message syslog.

    Vérifier que nos filtres utilisent bien le nom absolu (FQDN) ou non en fonction de ce que contiennent les propriétés sur lesquelles on travaille.

    Voir le contenu / la valeur des propriétés / variables :

    :programname, isequal, "prog1" /tmp/debug_rsyslog;RSYSLOG_DebugFormat
    & stop

    Si l'on connait la valeur d'aucune propriété (mais, forcément, ça va débiter pas mal) :

    *.*    /tmp/debug_rsyslog;RSYSLOG_DebugFormat
    Sun 21 Nov 2021 08:01:58 PM CET - permalink -
    - http://shaarli.guiguishow.info/?IjArIg
Links per page: 20 50 100
page 1 / 1
Mentions légales identiques à celles de mon blog | CC BY-SA 3.0

Shaarli - The personal, minimalist, super-fast, database free, bookmarking service by the Shaarli community - Help/documentation