2009-03-20 10 views
14

पर रीडायरेक्ट करना मैं डेबियन के लिए OpenTibia Server पैकेज करने की योजना बना रहा हूं। मैं जो चीजों में से एक करना चाहता हूं वह /etc/init.d के माध्यम से स्टार्टअप जोड़ना और otserv प्रक्रिया का डिमोनिज़ेशन करना है।मानक आउटपुट को सिसॉग

बात यह है कि हमें शायद आउटपुट को सिसॉग पर रीडायरेक्ट करना चाहिए। यह आमतौर पर syslog() फ़ंक्शन के माध्यम से किया जाता है।

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

वहाँ जगह हर एक "कॉल" एसटीडी करने के लिए :: अदालत और दोस्तों के बिना मानक आउटपुट और syslog में मानक त्रुटि उत्पादन रीडायरेक्ट करने के लिए एक उचित जोड़ने के लिए आसान है, रास्ता नहीं है: वर्तमान में, कोड के साथ swarmed है?

उत्तर

4

सुनिश्चित नहीं हैं कि एक सीधे "सी" इस सवाल का जवाब पर्याप्त होता है; लेकिन "सी" में आप अंतर्निहित stdio सुविधाओं का उपयोग (FILE *) को सीधे "लॉगजर" प्रक्रिया के बिना syslog कॉल में प्लग करने के लिए कर सकते हैं। http://mischasan.wordpress.com/2011/05/25/redirecting-stderr-to-syslog/

+1

यह है। यह बहुत अच्छा होगा यदि आप यहां अपनी पोस्ट के हिस्सों को भी पेस्ट करेंगे;) –

+1

यह शायद ही पोर्टेबल है, और यह मानक पॉज़िक्स – Alnitak

+0

@Ivan नहीं है: एक लिंक पेस्ट करना एक लेख चिपकाने से तेज़ है। मैं आपके ब्लॉग लिंक पर क्लिक करके राजस्व अर्जित नहीं करता हूं :-) – Mischa

2

एक उपयुक्त स्क्रिप्ट के साथ बाइनरी के निष्पादन को लपेटने का प्रयास करें, जो केवल stdout और stderr पढ़ता है, और syslog() का उपयोग करके उनसे कोई भी डेटा पढ़ता है। इसे लपेटा हुआ एप्लिकेशन में किसी कोड कोड के बिना काम करना चाहिए, और बहुत आसान होना चाहिए।

सुनिश्चित नहीं है कि मौजूदा स्क्रिप्ट्स पाइप में हैं, लेकिन यदि कोई लिखना मुश्किल नहीं है तो मुश्किल नहीं होना चाहिए।

+0

जो बहुत पोर्टेबल समाधान के रूप में प्रतीत होता है, इस प्रकार यह केवल हमें दो लॉग स्तर की त्रुटि और जानकारी प्राप्त करने में सक्षम बनाता है, लिनक्स syslog के पास अधिक loglevels है। लेकिन अगर हम इस छोटी सी कमी को खड़ा कर सकते हैं, तो यहां एक पोस्ट दिखाया गया है कि इसे कैसे पूरा किया जाए: http://unix.stackexchange.com/questions/124455/linux-how-to-redirect-stdout-stderr-to-logger –

21

आप कर सकते हैं पाइप अपने stdoutlogger कमांड के साथ syslog रहे हैं:

नाम

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

SYNOPSIS

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

वर्णन

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

आप कमांड लाइन पर एक संदेश की आपूर्ति नहीं है, तो इसे पढ़ता stdin

5

आप rdbuf() आदेश के माध्यम से C++ किसी भी स्ट्रीम अनुप्रेषित कर सकते हैं। यह लागू करने के लिए थोड़ा सा है लेकिन मुश्किल नहीं है।

आपको एक स्ट्रीमबफ लिखना होगा जो ओवरफ्लो() पर syslog पर आउटपुट करेगा, और std :: cout rdbuf को अपने स्ट्रीमबफ के साथ प्रतिस्थापित करेगा।

एक उदाहरण है, एक फाइल करने के लिए है कि उत्पादन होगा (कोई त्रुटि हैंडलिंग, अपरीक्षित कोड)

#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

लगभग जो मैं खोज रहा था, हालांकि, "लॉगर" मुझे अतिरिक्त जानकारी प्रदान करता है, खासकर यदि मैं बस एक रैपर बैश स्क्रिप्ट का उत्पादन करता हूं। हालांकि, जानकारी के लिए धन्यवाद, और मुझे खेद है कि मैं दोनों उत्तरों को उत्तर (टीएम) के रूप में चिह्नित नहीं कर सकता। –

1

मैं बस कुछ कोड है कि यह कर देगा लिखा था। यह syslog के बजाय एएसएल का उपयोग कर है, और यह kevents का उपयोग कर रहा है, तो आप (एएसएल और चुनाव के बजाय syslog/kevent के बजाय चुनें) आपके सिस्टम के लिए अलग एपीआई के लिए यह बंदरगाह के लिए आवश्यकता हो सकती है

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

इसके अलावा, मैं मूल रूप से इसे माउंटेन शेर पर libsystem_asl में जोड़ा गया। Asl_log_descriptor के लिए मैन पेज देखें।

उदाहरण:

#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; 
} 
संबंधित मुद्दे