2009-03-20 13 views
14

Ich plane, Paket OpenTibia Server für Debian. Eines der Dinge, die ich tun möchte, ist Start über /etc/init.d und Daemonisierung des otserv Prozesses hinzufügen.Standardausgabe an syslog umleiten

Die Sache ist, sollten wir wahrscheinlich Ausgabe an Syslog umleiten. Dies geschieht normalerweise über die syslog() Funktion. Derzeit wird der Code wimmelt:

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

Gibt es eine richtige, leicht zu addieren, Art und Weise der Standardausgabe und Standardfehlerausgabe in syslog zu umleiten, ohne jeden einzelnen „Anruf“ ersetzt std :: cout und Freunde?

Antwort

4

Nicht sicher, ob eine gerade "C" Antwort genügt; aber in "C" können Sie die zugrunde liegenden stdio-Funktionen verwenden, um die (FILE *) direkt in Syslog-Aufrufe zu stecken, ohne einen dazwischenliegenden "Logger" -Prozess. Schauen Sie sich http://mischasan.wordpress.com/2011/05/25/redirecting-stderr-to-syslog/

+1

Das ist es. Es wäre großartig, wenn Sie auch Teile Ihres Posts hier einfügen würden;) –

+1

es ist kaum portabel, und es ist kein Standard POSIX – Alnitak

+0

@Ivan: Einfügen eines Links ist schneller als Einfügen eines Artikels. Ich verdiene kein Einkommen, wenn ich auf meinen Bloglink klicke :-) – Mischa

2

Versuchen Sie, die Ausführung der Binärdatei mit einem geeigneten Skript zu verpacken, das nur stdout und stderr liest und alle von ihnen gelesenen Daten mit syslog() sendet. Das sollte ohne Codeänderungen in der verpackten Anwendung funktionieren und ziemlich einfach sein.

Nicht sicher, ob es Skripte gibt, in die man pipettieren sollte, aber das Schreiben sollte nicht schwer sein, wenn nicht.

+0

, die als eine sehr portable Lösung scheint, so wird dies nur ermöglichen uns zwei Log-Ebenen Fehler und Informationen, die Linux-Syslog hat mehr Loglevel zur Hand. Aber wenn wir diesen kleinen Nachteil ertragen können, hier ist ein Beitrag, der zeigt, wie man das erreicht: http://unix.stackexchange.com/questions/124455/linux-how-to-redirect-stdout-stderr-to-logger –

21

Sie können Rohr Ihre stdout-syslog mit dem logger Befehl:

Name

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

SYNTAX

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

BESCHREIBUNG

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

Wenn Sie es stdin

5

liest keine Nachricht auf der Kommandozeile liefern können alle Stream in C++ Umleitung über die RDBUF() Befehl. Dies ist etwas kompliziert zu implementieren, aber nicht so schwer.

Sie müssen einen streambuf schreiben, der in syslog on overflow() ausgegeben wird, und std :: cout rdbuf durch streambuf ersetzen.

Ein Beispiel, das würde in eine Datei ausgegeben (keine Fehlerbehandlung, nicht getesteten Code)

#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

Fast Was ich jedoch suchte, liefert "Logger" mir zusätzliche Informationen, besonders wenn ich einfach ein Wrapper-Bash-Skript erzeuge. Aber danke für die Informationen, und es tut mir leid, dass ich nicht beide Antworten als The Answers (tm) markieren kann. –

1

Ich schrieb einige Code, der dies tun wird. Es ist mit ASL anstelle von syslog, und es ist kevents verwenden, so können Sie in den Hafen müssen es verschiedene APIs für Ihr System (syslog anstelle von ASL und Umfrage/wählen statt kevent)

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

Außerdem I im Wesentlichen hinzugefügt zu libsystem_asl auf Mountain Lion. Überprüfen Sie die Manpage für asl_log_descriptor.

Beispiel:

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