Redirigeant la sortie standard vers syslog
Question
Je prévois emballer OpenTibia serveur pour Debian. L'une des choses que je veux faire est d'ajouter le démarrage via démonisation et du /etc/init.d
processus otserv
.
La chose est, nous devrions probablement rediriger la sortie vers syslog. Cela se fait généralement via la fonction syslog()
. À l'heure actuelle, le code est fourmillaient avec:
std::cout << "Stuff to printout" << std::endl;
Yat-il un bon, facile d'ajouter, de rediriger la sortie manière standard et la sortie d'erreur standard en syslog sans remplacer chaque « appel » à std :: Cout et les amis?
La solution
Je ne sais pas si une réponse « C » droite suffit; mais dans « C », vous pouvez utiliser les fonctions stdio sous-jacentes pour brancher le (FILE *) directement dans les appels syslog, sans intervention processus de « bûcheron ». Check-out http://mischasan.wordpress.com/2011/05/ 25 / redirection à stderr-syslog /
Autres conseils
Vous pouvez diriger votre à stdout
avec la syslog
commande logger
:
NOM
logger - a shell command interface to the syslog(3) system log module
SYNOPSIS
logger [-isd] [-f file] [-p pri] [-t tag] [-u socket] [message ...]
Description
Logger makes entries in the system log. It provides a shell command interface to the syslog(3) system log module.
Si vous ne fournissez pas un message sur la ligne de commande, il lit stdin
Vous pouvez rediriger tout flux en C ++ via la commande rdbuf (). C'est un peu alambiquée à mettre en œuvre mais pas difficile.
Vous devez écrire un streambuf qui sortie syslog en cas de débordement () et remplacer le std :: Cout rdbuf avec votre streambuf.
Un exemple, qui serait sortie dans un fichier (pas de traitement d'erreur, le code non testé)
#include <iostream>
#include <fstream>
using namespace std;
int main (int argc, char** argv) {
streambuf * yourStreamBuffer = NULL;
ofstream outputFileStream;
outputFileStream.open ("theOutputFile.txt");
yourStreamBuffer = outputFileStream.rdbuf();
cout.rdbuf(yourStreamBuffer);
cout << "Ends up in the file, not std::cout!";
outputFileStream.close();
return 0;
}
Essayez d'envelopper l'exécution du binaire avec un script approprié, qui lit juste stdout et stderr, et envoyer des données lues sur l'utilisation les syslog()
. Cela devrait fonctionner sans aucune modification de code dans l'application enveloppé, et être assez facile.
Je ne sais pas s'il y a des scripts existants à tuyau dans, mais écrire un ne devrait pas être difficile, voire.
Je viens d'écrire un code qui va le faire. Il utilise ASL au lieu de syslog, et il utilise kevents, vous devrez peut-être le port à différentes API pour votre système (syslog au lieu de l'ASL et poll / select au lieu de kevent)
http://cgit.freedesktop.org/xorg/ app / xinit / arbre / launchd / console_redirect.c
En outre, je essentiellement ajouté à libsystem_asl sur Mountain Lion. Consultez la page de manuel pour asl_log_descriptor.
Exemple:
#include <asl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
asl_log_descriptor(NULL, NULL, ASL_LEVEL_INFO, STDOUT_FILENO, ASL_LOG_DESCRIPTOR_WRITE);
asl_log_descriptor(NULL, NULL, ASL_LEVEL_NOTICE, STDERR_FILENO, ASL_LOG_DESCRIPTOR_WRITE);
fprintf(stdout, "This is written to stdout which will be at log level info.");
fprintf(stderr, "This is written to stderr which will be at log level notice.");
return 0;
}