2013-05-08 10 views
8

मेरे पास एक ऐसा एप्लिकेशन है जो दो मोड में चला सकता है, या तो सीएलआई के साथ, या डिमन के रूप में।क्या syslog संदेशों को stdout पर रीडायरेक्ट करने का कोई तरीका है?

मैं लॉगिंग के लिए syslog() का उपयोग कर रहा हूं। हालांकि, जब सीएलआई मोड में चलाया जाता है तो मुझे सभी लॉगिंग चाहिए, LOG_DEBUG चिह्नित किए गए संदेशों को छोड़कर, लॉग के बजाय कंसोल पर भेजे जाने वाले संदेश।

मैंने setlogmask() का उपयोग करने का प्रयास किया है, लेकिन ऐसा लगता है कि यह कंसोल पर रीडायरेक्ट नहीं होता है।

ऐसा करने का सबसे अच्छा तरीका क्या है?

+2

AFAIK, फ्रीबीएसडी का syslog /etc/syslog.conf के माध्यम से रीडायरेक्ट करने की अनुमति देता है। वैसे भी, यह एक ऐसा तरीका नहीं है जिसे आप ढूंढ रहे हैं। मैं फ़ंक्शन लिखने का सुझाव देता हूं जो पता लगाएगा कि क्या आप सीएलआई ऐप या डिमन के रूप में चल रहे हैं और यह क्या करना चाहिए: कंसोल या syslog पर लिखें। – maverik

उत्तर

4

मावेरिक द्वारा टिप्पणियों में सुझाव के अनुसार, मैंने सिसलॉग के चारों ओर एक रैपर लिखा जो निर्धारित करता है कि आउटपुट को लॉग या कंसोल पर भेजना है या नहीं। यहां किसी को भी इसकी आवश्यकता होने पर यह है।

void mylog (int level, const char *format, ...) 
{ 
    va_list args; 
    va_start (args, format); 

    if (remote) 
    { 
     vsyslog(level, format, args); 
    } 
    else 
    { 
     if (level == LOG_DEBUG) 
      vsyslog(level, format, args); 
     else 
      vprintf(format, args); 
    } 
    va_end(args); 
} 
+4

फ़ंक्शन से लौटने से पहले 'va_end (args)' पर कॉल करें। – jxh

1

जीएनयू-विशिष्ट समाधान के रूप में मैं openlog(NULL, LOG_PERROR, your_facility) का उपयोग करने का सुझाव दूंगा। अनुकूलन योग्य नहीं है (बस stderr पर डुप्लिकेट)।

संबंधित मुद्दे

 संबंधित मुद्दे