Domanda

ho intenzione di confezionare OpenTibia Server per Debian. Una delle cose che voglio fare è aggiungere l'avvio tramite /etc/init.d e daemonization del processo otserv.

La cosa è, probabilmente dovremmo redirigere l'output a syslog. Questo è solitamente fatto attraverso la funzione di syslog(). Attualmente, il codice è pullulava di:

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

C'è un modo corretto, semplice per aggiungere, per reindirizzare lo standard output e standard error in syslog senza sostituire ogni singolo "chiamata" a std :: cout e gli amici?

È stato utile?

Soluzione

Non è sicuro se un rettilineo risposta "C" è sufficiente; ma in "C" è possibile usare funzioni stdio sottostanti per collegare il (FILE *) direttamente in chiamate syslog, senza un processo intermedio "logger". Check-out http://mischasan.wordpress.com/2011/05/ 25 / reindirizzamento-stderr-to-syslog /

Altri suggerimenti

È possibile reindirizzare la tua stdout per syslog con il comando logger:

  

nome

 logger - a shell command interface to the syslog(3) system log module
     

SINOSSI

 logger [-isd] [-f file] [-p pri] [-t tag] [-u socket] [message ...]
     

DESCRIZIONE

 Logger makes entries in the system log.  It provides a shell command
 interface to the syslog(3) system log module.

Se non si fornisce un messaggio sulla riga di comando si legge stdin

È possibile reindirizzare qualsiasi flusso in C ++ tramite il comando rdbuf (). Questo è un po 'contorto da implementare, ma non è così difficile.

È necessario scrivere uno streambuf che sarebbe uscita a syslog in caso di overflow (), e sostituire il rdbuf std :: cout con lo streambuf.

Un esempio, che avrebbe output in un file (senza gestione degli errori, codice non testato)

#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;
 }

Prova avvolgendo l'esecuzione del binario con uno script adatto, che appena legge stdout e stderr, e inviare i dati letti da loro sull'uso syslog(). Che dovrebbe funzionare senza alcuna modifica del codice nell'applicazione avvolto, ed essere abbastanza facile.

Non so se ci sono gli script nella tubazione esistente in, ma la scrittura non dovrebbe essere difficile, se non.

Ho appena scritto un codice che lo farà. E 'utilizzando ASL invece di syslog, ed è con kevents, quindi potrebbe essere necessario per crearlo in diverse API per il sistema (syslog invece di ASL e sondaggio / selezionare invece di KEVENT)

http://cgit.freedesktop.org/xorg/ app / xinit / albero / launchd / console_redirect.c

Inoltre, ho praticamente aggiunto questo a libsystem_asl su Mountain Lion. Controlla la pagina man per asl_log_descriptor.

Esempio:

#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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top