Je travaille sur Unix sur un programme C++ qui envoie des messages à syslog.Rediriger C++ std :: clog vers syslog sous Unix
Le code actuel utilise l'appel système syslog qui fonctionne comme printf.
Maintenant, je préfère utiliser un flux à cette fin, généralement le std :: clog intégré. Mais saboter simplement rediriger la sortie vers stderr, pas vers syslog et cela est inutile pour moi car j'utilise aussi stderr et stdout à d'autres fins. J'ai vu dans another answer que c'est assez facile de le rediriger vers un fichier en utilisant rdbuf() mais je ne vois aucun moyen d'appliquer cette méthode pour appeler syslog car openlog ne retourne pas un gestionnaire de fichier que je pourrais utiliser pour lier un ruisseau dessus.
Existe-t-il une autre méthode pour le faire? (semble assez basique pour la programmation d'unix)?
Editer: Je suis à la recherche d'une solution qui n'utilise pas de bibliothèque externe. Ce que propose @Chris pourrait être un bon début mais reste un peu vague pour devenir la réponse acceptée.
Édition: l'utilisation de Boost.IOStreams est OK car mon projet utilise déjà Boost de toute façon.
La liaison avec une bibliothèque externe est possible mais est également un problème car c'est un code GPL. Les dépendances sont également un fardeau car elles peuvent entrer en conflit avec d'autres composants, ne pas être disponibles sur ma distribution Linux, introduire des bogues de tiers, etc. Si c'est la seule solution que je peux envisager complètement éviter les flux ... (dommage).
syslog nécessite plus qu'une simple chaîne de message; il nécessite également un 'niveau d'erreur' et ainsi de suite. Je ne suis pas sûr si cela est possible en utilisant des flux. Peut-être avec des manipulateurs (comme 'std :: hex'')? – ereOn
Jetez un coup d'œil sur les bibliothèques de journalisation disponibles. Beaucoup vous permettront d'écrire vos propres backends pour écrire votre message là où vous voulez les écrire. beaucoup viennent également avec le filtrage intégré et d'autres fonctionnalités intéressantes. Il y a seulement quelques légères qui viennent avec seulement peu de bagages, mais vous pouvez les trouver si vous voulez. J'utilise celui-ci: http://www.templog.org/ C'est juste un peu de fichier source, presque tous dans les en-têtes, et bon pour filtrer au moment de la compilation (pour le code critique) ainsi que temps. Mais vous pourriez aimer un autre. Ne réinventez simplement pas la roue. – sbi
Si cela ne peut pas être fait en utilisant sabot intégré, un autre flux défini par l'utilisateur serait presque aussi bon, je m'en fous si le niveau est défini en utilisant les manipulateurs ou la fonction de membre. – kriss