Pregunta

Estoy planeando paquete OpenTibia Servidor para Debian.Una de las cosas que yo quiero hacer es agregar el inicio a través de /etc/init.d y daemonization de la otserv proceso.

La cosa es que, probablemente deberíamos redirigir la salida a syslog.Esto se hace generalmente a través de la syslog() la función.Actualmente, el código es pululaban con:

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

Hay una correcta, fácil de agregar, camino para redirigir la salida estándar y la salida de error estándar en syslog sin reemplazar cada "llamada" a std::cout y amigos?

¿Fue útil?

Solución

No está seguro de si una recta respuesta "C" es suficiente; pero en "C" puede utilizar las funciones stdio subyacentes para tapar el (FILE *) directamente en las llamadas de registro del sistema, sin un proceso de "registrador" intervenir. Revisa http://mischasan.wordpress.com/2011/05/ 25 / redireccionamiento-stderr-a-syslog /

Otros consejos

Puede canalizar su stdout a syslog con el comando logger:

  

nombre

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

SINOPSIS

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

descripción

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

Si no se proporciona un mensaje en la línea de comandos se lee stdin

Puede redirigir cualquier corriente en C ++ a través del comando rdbuf (). Esto es un poco complicado de implementar, pero no es tan difícil.

Es necesario escribir una streambuf que sería la salida a syslog en caso de desbordamiento (), y sustituir el rdbuf std :: cout con su streambuf.

Un ejemplo, que haría salida a un archivo (sin control de errores, el código no probado)

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

Trate de envolver la ejecución del binario con un guión adecuado, que simplemente lee stdout y stderr, y enviar los datos leídos de ellas en el uso de syslog(). Eso debería funcionar sin ningún cambio de código en la aplicación envuelto, y ser bastante fácil.

No estoy seguro si hay secuencias de comandos a la tubería existente en, pero escribir uno no debe ser difícil si no.

Me acabo de escribir un código que va a hacer esto. Es el uso de ASL en lugar de syslog, y es usando kevents, de manera que deberá portarlo a diferentes APIs para su sistema (syslog en lugar de ASL y sondeo / seleccione en lugar de kevent)

http://cgit.freedesktop.org/xorg/ app / init / árbol / launchd / console_redirect.c

Además, básicamente añadió esta a libsystem_asl el león de montaña. Echa un vistazo a la página del manual de asl_log_descriptor.

Ejemplo:

#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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top