web-dev-qa-db-fra.com

Connexion Daemon sous Linux

J'ai donc un démon fonctionnant sur un système Linux et je souhaite avoir un enregistrement de ses activités: un journal. La question est de savoir quel est le "meilleur" moyen d'y parvenir.

Ma première idée est simplement d'ouvrir un fichier et de l'écrire.

FILE* log = fopen("logfile.log", "w");
/* daemon works...needs to write to log */
fprintf(log, "foo%s\n", (char*)bar);
/* ...all done, close the file */
fclose(log);

Y a-t-il quelque chose qui cloche fondamentalement avec la journalisation de cette façon? Existe-t-il un meilleur moyen, tel qu'un framework intégré à Linux?

64
codemonkey

Unix dispose depuis longtemps d'un framework de journalisation spécial appelé syslog . Tapez dans votre shell

man 3 syslog

et vous obtiendrez de l'aide pour l'interface en C.

Certainsexemples

#include <stdio.h>
#include <unistd.h>
#include <syslog.h>

int main(void) {

 openlog("slog", LOG_PID|LOG_CONS, LOG_USER);
 syslog(LOG_INFO, "A different kind of Hello world ... ");
 closelog();

 return 0;
}
100
Vinko Vrsalovic

Ce va probablement être un C’était une course de chevaux, mais oui, l’installation syslog qui existe dans la plupart, sinon dans la totalité, des dérivés Un * x est la méthode préférée. Il n'y a rien de mal à se connecter à un fichier, mais cela vous laisse un certain nombre de tâches:

  • existe-t-il un système de fichiers sur votre emplacement de journalisation pour enregistrer le fichier?
  • qu'en est-il de la mise en mémoire tampon (pour les performances) et du vidage (pour obtenir les journaux écrits avant un crash du système)
  • si votre démon est exécuté pendant longtemps, que faites-vous du fichier journal en croissance constante.

Syslog s'occupe de tout cela, et plus encore, pour vous. L'API est similaire au clan printf, vous ne devriez donc avoir aucun problème à adapter votre code.

21
Richard

Un autre avantage de syslog dans les installations plus grandes (ou plus soucieuses de la sécurité): le démon syslog peut être configuré pour envoyer les journaux à un autre serveur afin qu'il soit enregistré à la place (ou en plus) du système de fichiers local.

Il est beaucoup plus pratique d'avoir tous les journaux de votre batterie de serveurs au même endroit plutôt que de les lire séparément sur chaque ordinateur, en particulier lorsque vous essayez de corréler les événements d'un serveur avec ceux d'un autre. Et quand on se casse, on ne peut plus faire confiance à ses journaux ... mais si le serveur de journaux est resté sécurisé, vous savez que rien n’aura été supprimé de ses journaux, ainsi tout enregistrement de l’intrusion sera intact.

11
Dave Sherohman

Je crache beaucoup de messages de démon sur daemon.info et daemon.debug lorsque je teste des unités. Une ligne dans votre fichier syslog.conf peut coller ces messages dans le fichier de votre choix.

http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/040/4036/4036s1.html a une meilleure explication de l'API C que la page de manuel, imo.

8
phreakre

Si vous utilisez le threading et que vous utilisez la journalisation en tant qu'outil de débogage, vous souhaiterez rechercher une bibliothèque de journalisation utilisant une sorte de mémoire tampon sécurisée pour les threads, mais déverrouillée. Un tampon par thread, avec un verrou global uniquement lorsque cela est strictement nécessaire.

Cela évite que la journalisation provoque des ralentissements importants dans votre logiciel et évite de créer des bogues qui changent lorsque vous ajoutez une journalisation de débogage.

S'il a un format de journal binaire compressé à haute vitesse qui ne perd pas de temps avec les opérations de formatage pendant la journalisation et certains outils d'analyse et d'affichage de journaux Nice, c'est un bonus.

Je fournirais une référence à un bon code pour cela mais je n'en ai pas moi-même. Je veux juste un. :)

2
Zan Lynx

Comme indiqué ci-dessus, vous devriez examiner syslog. Mais si vous voulez écrire votre propre code d'enregistrement, je vous conseillerais d'utiliser le mode "a" (write append) de fopen.

L'écriture de votre propre code de journalisation présente quelques inconvénients: gestion de la rotation des journaux, verrouillage (si vous avez plusieurs threads), synchronisation (voulez-vous attendre que les journaux soient écrits sur le disque?). Un des inconvénients de syslog est que l’application ne sait pas si les journaux ont été écrits sur le disque (ils ont peut-être été perdus).

2
Mathias Brossard

Syslog est une bonne option, mais vous pouvez envisager de regarder log4c. Les frameworks log4 [quelque chose] fonctionnent bien dans leurs implémentations Java et Perl et vous permettent - à partir d'un fichier de configuration - de choisir de vous connecter à Syslog, à la console, aux fichiers plats ou aux enregistreurs de journaux définis par l'utilisateur. Vous pouvez définir des contextes de journal spécifiques pour chacun de vos modules et les journaliser à un niveau différent, tel que défini par votre configuration. (trace, debug, info, warn, error, critical) et demandez à votre démon de relire ce fichier de configuration à la volée en capturant un signal, ce qui vous permet de manipuler les niveaux de journalisation sur un serveur en cours d'exécution.

2
Jon Topper

Notre système intégré ne contient pas syslog, alors les démons que j'écris effectuent le débogage vers un fichier en utilisant le mode d'ouverture "a" similaire à celui décrit précédemment. J'ai une fonction qui ouvre un fichier journal, crache le message puis ferme le fichier (je ne le fais que lorsque quelque chose d'inattendu se produit). Cependant, j'ai également dû écrire du code pour gérer la rotation du journal, comme d'autres commentateurs l'ont mentionné, qui consiste en 'tail -c 65536 logfile> logfiletmp && mv logfiletmp logfile'. C'est assez difficile et devrait peut-être s'appeler "troncations frontales de journal", mais cela empêche notre petit système de fichiers RAM basé sur disque de se remplir de fichier journal.

1
MattSmith

Jusqu'à présent, personne n'a mentionné la bibliothèque de journaux boost qui offre un moyen simple et agréable de rediriger vos messages de journal Vers des fichiers ou un collecteur syslog ou même le journal des événements Windows.

1
alexkr

Il existe de nombreux problèmes potentiels: par exemple, si le disque est plein, voulez-vous que votre démon échoue? En outre, vous écraserez votre fichier à chaque fois. Un fichier circulaire est souvent utilisé pour allouer de l'espace sur la machine, mais vous pouvez conserver suffisamment d'historique pour être utile sans prendre trop de place ..__ Il existe des outils tels que log4c que vous pouvez vous aider. Si votre code est c ++, alors vous pourriez considérer log4cxx dans le projet Apache (apt-get install liblog4cxx9-dev sur Ubuntu/debian), mais il semble que vous utilisez C.

0
David Nehme