Rsyslog
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