2009-03-20 11 views
14

Je prévois de mettre en package OpenTibia Server pour Debian. Une des choses que je veux faire est d'ajouter le démarrage via /etc/init.d et la démonisation du processus otserv.Rediriger la sortie standard vers syslog

Cela étant, nous devrions probablement rediriger la sortie vers syslog. Cela est généralement effectué via la fonction syslog(). À l'heure actuelle, le code est grouillait:

std::cout << "Stuff to printout" << std::endl; 

est-il un bon, facile à ajouter, façon de rediriger la sortie standard et la sortie d'erreur standard en syslog sans remplacer chaque « appel » à std :: Cout et les amis?

Répondre

4

Je ne sais pas si une réponse "C" droite suffit; mais en "C", vous pouvez utiliser les fonctions stdio sous-jacentes pour brancher le (FILE *) directement dans les appels syslog, sans intervention de "logger". Check out http://mischasan.wordpress.com/2011/05/25/redirecting-stderr-to-syslog/

+1

C'est ça. Ce serait génial si vous collez des parties de votre message ici aussi;) –

+1

c'est à peine portable, et ce n'est pas standard POSIX – Alnitak

+0

@Ivan: coller un lien est plus rapide que de coller un article. Je ne gagne pas de revenus en cliquant sur le lien de mon blog :-) – Mischa

2

Essayez d'encapsuler l'exécution du binaire avec un script approprié, en lisant stdout et stderr, et en envoyant toutes les données lues en utilisant syslog(). Cela devrait fonctionner sans aucun changement de code dans l'application enveloppée, et être assez facile.

Vous ne savez pas s'il existe des scripts existants, mais l'écriture ne doit pas être difficile si ce n'est pas le cas.

+0

Cela semble être une solution très portable, donc cela ne nous permettra que d'avoir deux niveaux d'erreurs et d'informations, le syslog de Linux a plus de niveaux de journalisation à portée de main. Mais si nous pouvons supporter ce petit inconvénient, voici un post montrant comment y parvenir: http://unix.stackexchange.com/questions/124455/linux-how-to-redirect-stdout-stderr-to-logger –

21

Vous pouvez diriger votre stdout-syslog avec la 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

5

Vous pouvez rediriger tout flux en C++ via la commande rdbuf(). C'est un peu compliqué à mettre en œuvre mais pas si difficile.

Vous devez écrire un streambuf qui sera généré dans syslog sur overflow(), et remplacer std :: cout rdbuf par votre streambuf.

Un exemple, qui génèrerait un fichier (pas de gestion des erreurs, 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; 
} 
+0

Presque Ce que je cherchais, cependant, "logger" me fournit des informations supplémentaires, surtout si je produis simplement un script bash wrapper. Cependant, merci pour l'information, et je suis tellement désolé que je ne peux pas marquer les deux réponses comme les réponses (tm). –

1

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/tree/launchd/console_redirect.c

De plus, je fondamentalement ajouté cela à 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; 
} 
Questions connexes