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?

Était-ce utile?

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top