Utiliser syslog en C
Syslog est un protocole définissant un service de journaux (de log). C'est un standard sous les systèmes Unix.
Il s'agit d'un client serveur. Le client émet les informations sur le port UDP 514. Les serveurs vont ensuites créer les journaux.
Le fichier /etc/syslog.conf va permettre de paramétrer les journaux suivant leur origine.
Ce fichier n'existe pas pour les systèmes utilisant systemd (journalctl). C'est le cas de Mageia.
Il est composé de 2 informations par ligne:
- L'origine du message.priorité
- La destination qui pourra être un fichier ou un serveur
Pour le développeur
Ce qui nous intéresse ici en tant que développeur, est d'écrire des informations dans les logs.
Pour le shell, il faut utiliser la commande logger
Pour le développement en C, vsyslog() ou syslog()
D'où les explications C suivantes:
#include <syslog.h>
- Ouvrir une connexion avec le serveur de journalisation
Cet appel n'est pas obligatoire. Il sera nécessaire uniquement si vous voulez changer le label utilisé pour identifier vos traces dans le fichier /var/log/syslog. Sans cet appel, le nom du programme sera automatiquement utilisé par syslog.
void openlog (const char *ident, int option, int facility);
En entrée:
ident sera ajouté à chaque message et est souvent positionné avec le nom du programme.
option qui peut prendre les valeurs suivants (| pour cumuler plusieurs options)
Option | Désignation |
LOG_CONS | Si une erreur se produit avec syslog, renvoyer l'information sur la console système. |
LOG_NDELAY | Ouvrir la connexion immédiatement, ne pas attendre l'envoi via syslog pour faire la connexion (voir LOG_ODELAY) |
LOG_NOWAIT | Ne pas attendre la fin des processus fils eventuellement créés pour enregistrer les logs |
LOG_ODELAY | Option inutile, car positionnée par défaut. Ne faire la connexion que lors de l'appel à syslog |
LOG_PERROR | Ecriture du message sur stderr en plus de ce qui est indiqué dans le fichier de configuration |
LOG_PID | Inclure le PID dans les messages |
facility qui permet de préciser le type de programme qui envoi le message en journalisation:
Facility | Désignation |
LOG_AUTH | Ne pas utiliser, préférez LOG_AUTHPRIV |
LOG_AUTHPRIV | Message de sécurité/autorisation |
LOG_CRON | Message de CRON ou AT |
LOG_DAEMON | Message d'un démon |
LOG_FTP | Démon FTP |
LOG_KERN | Message du noyau |
LOG_LOCAL0 à 7 | Réservé pour des utilisation locales |
LOG_LPR | Sous système d'impression |
LOG_MAIL | Du courrier |
LOG_NEWS | des news USENET |
LOG_SYSLOG | Message interne de SYSLOG |
LOG_USER | Utilisateur générique |
LOG_UUCP | Sous système UUCP |
- Puis envoyer un message:
void syslog (int priority, const char *format, ...);
Avec en entrée:
priority, une combinaison (utilisez le |) de niveau de priorité et de facility vu précédemment.
Level | Désignation |
LOG_EMERG | Le système est devenu inutilisable... |
LOG_ALERT | Il est urgent d'intervenir ! |
LOG_CRIT | Condition critiques |
LOG_ERR | Erreurs |
LOG_WARNING | Des avertisseements... |
LOG_NOTICE | Notification... |
LOG_INFO | Simple information |
LOG_DEBUG | Debogage. |
format : le texte au format printf
... : Les arguments qui seront utilisés avec format.
- Enfin, terminer la communication avec le serveur
void closelog(void);
Exemple de code
Le code est très simple en fait:
Annexes
- Il existe une autre commande pour passer des messages:
void vsyslog (int priority, const char *format, va_list ap);
Similaire à syslog. Cependant, elle prend ses arguments obtenus à l'aide de macros stdarg.
D'où l'utilisation de l'include suivant:
#include <stdarg.h>
- Il existe différents démons pour gérer les messages: sustemd ou syslog (rsyslog) seront les plus connus
Utilisez journalctl pour systemd (par exemple journalctl --since "1 hour ago" pour voir les messages ayant moins d'une 1 heure)
Utilisez tail /var/log/syslog pour voir les 10 dernières lignes enregistrées par syslog ou tail -f /var/log/syslog | grep identifiant_programme pour voir en temps réel les messages de identifiant_programme