Rsyslog

De wiki jackbot
Aller à la navigation Aller à la recherche


Rsyslog permet de gérer les journaux d’événements, capable d'agir comme un serveur afin de récupérer les journaux des machines sur le réseau.

Configuration du mode serveur

Configuration des protocoles et écoute des ports

Afin de pouvoir recevoir les messages provenant du réseau, il faut configurer le protocole utilisé ainsi que le port. Pour ce faire il faut éditer le fichier : /etc/rsyslog.conf et repérer ce passage :

# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")

# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")

Assez explicite, mais je vais tout de même détailler

module(load="imudp")

Active le module permettant d'écouter avec le protocole UDP

input(type="imudp" port="514")

Configure l'entrée pour utiliser le protocole UDP sur le port 514. Les autres lignes font la même chose pour le protocole TCP. Une fois ces lignes décommentées/ajoutées et rsyslog rechargé/redémarré, il écoutera sur le port 514 en UDP et TCP.

Configuration et traitement des logs entrants

Les templates

Les templates sont des points clefs de la configuration de rsyslog. La syntaxe générale est la suivante :

template(parameters)

Formatage du message

On peut à l'aide d'un template formater les messages entrants voici un petit exemple :

template(
        name="format"
        type="string"
        string="%TIMESTAMP:::date-rfc3339% %hostname% %syslogtag% msg : %msg%\n"
)

La liste des différents paramètres tels que : %hostname%, %syslogtag% est consultable ici

Variables

On peut également créer des variables

set $.test = replace($syslogtag, ":", "");

Dans cet exemple on retire le caractère ':' dans la chaîne de caractère syslogtag

Emplacement des logs

Pour définir un emplacement spécifique pour les logs on peut créer un template du type :

template (
    name="RemoteLogs"
    type="string"
    string="/var/log/chemin/test.log"
)

Application

Les templates étant définie il ne reste plus qu'a les appliquer. Pour cela il faut spécifier à quel facility.severity on souhaite les appliquer.

facility.severity_level	nom_template
On peut également choisir d'appliquer des templates à tous les logs entrants
*.* ?RemoteLogs

Ne pas oublier d'arrêter le traitement une fois que les informations ont été écrites dans un fichier et éviter ainsi qu'ils soit également écrit dans les fichiers locaux.

stop

Récapitulatif

template(
        name="format"
        type="string"
        string="%TIMESTAMP:::date-rfc3339% %hostname% %syslogtag% msg : %msg%\n"
)

template (
    name="RemoteLogs"
    type="string"
    string="/var/log/chemin/test.log"
)

#pour appliquer les deux templates à tous les logs
*.* -?RemoteLogs;format

stop


Configuration coté client

Ici ça va être facile et rapide, il suffira d'ajouter au fichier : /etc/rsyslog.conf

*.*  @@192.168.100.10:514

Lui indiquant ainsi que tous ses logs doivent être envoyés vers l'adresse et le port indiqué. Il est cependant tout à fait possible de restreindre les logs envoyés en utilisant une syntaxe du type :

auth.*  @@192.168.100.10:514

Utilisation avec Docker

On peut voir sur la page Docker logs comment rediriger les logs des différents conteneurs vers un serveur rsyslog. On peut utiliser une astuce pour classer proprement les logs en utilisant le paramètre syslogtag.

set $.chemin = replace($syslogtag, ":", "");

template (
    name="RemoteLogs"
    type="string"
    string="/var/log/remotelogs/%$.chemin%.log"
)

*.* -?RemoteLogs

Avec cette configuration on peut alors utiliser l'option logging de docker de cette façon :

version: "3.7"
  test:
    image: nginx:1.22
    container_name: nginx
    ports:
      - "80:80"
    logging:
      driver: syslog
      options:
        syslog-address: "udp://192.168.100.10:514"
        tag: "conteneur_test/{{.Name}}:"

Ce qui aura les conséquences suivante :

  • créer le paramètre syslogtag ayant pour valeur : "conteneur_test/nginx:" (Notez la présence du caratère ':' qui est là pour cloturer la chaîne)
  • le serveur rsyslog recevra ce paramètre
  • il va enlever le caractère ':' et enregistrer le résultat dans la variable $.chemin
  • créer un fichier log en suivant le template : /var/log/remotelogs/%$.chemin%.log

Résultat les logs de ce conteneurs arriveront dans : /var/log/remotelogs/conteneur_test/nginx.log On peut donc maintenant regrouper dans un même dossier les logs des conteneurs opérant pour le même services

Utilisation générale

On peut toujours ajouter des logs provenant d'une autre source que Docker en ajoutant à la configuration de rsyslog les lignes suivantes :

template(
        name="format"
        type="string"
        string="netgear/%programname%: %msg%\n"
)

*.* @192.168.100.10:514;format

Ce qui peut être intéressant pour récupérer les logs de ses routeurs au même endroit.

Source