Redirigir la salida estándar a syslog
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?
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;
}