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.

AttentionCe 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

Note: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