2008-10-16 13 views
9

हमारे पास लिनक्स पर एक एप्लिकेशन है जो syslog तंत्र का उपयोग करता है। एक सप्ताह के बाद यह पता लगाने की कोशिश की गई कि यह एप्लिकेशन अपेक्षा से धीमा क्यों चल रहा था, हमने पाया कि अगर हमने सिसलॉग को हटा दिया है, और सीधे लॉग फ़ाइल में लिखा है, तो प्रदर्शन नाटकीय रूप से सुधार हुआ है।syslog प्रदर्शन बेहतर हो सकता है?

मुझे समझ में आता है कि क्यों सीएसएलॉग सीधे फ़ाइल लिखने से धीमा है। लेकिन मैं सोच रहा था: क्या इसके प्रदर्शन को अनुकूलित करने के लिए syslog को कॉन्फ़िगर करने के तरीके हैं?

उत्तर

20

कॉन्फ़िगरेशन फ़ाइल में लॉग फ़ाइल पथ में "-" प्रीपेड करके लॉग संदेश के बाद लॉग फ़ाइलों को सिंक न करने के लिए आप syslogd (और कम से कम rsyslog) को कॉन्फ़िगर नहीं कर सकते हैं। यह खतरे के खर्च पर प्रदर्शन को गति देता है कि लॉग इन संदेशों को दुर्घटना में खोया जा सकता है।

1

अपना स्वयं का syslog कार्यान्वयन लिखें। :- पी

यह दो तरीकों से पूरा किया जा सकता है।

  1. अपनी खुद की LD_PRELOAD हुक लिखें syslog कार्यों ओवरराइड करने के लिए, और उन्हें stderr बजाय करने के लिए उत्पादन किया जाता है। मैंने वास्तव में कई वर्षों पहले इस बारे में एक पोस्ट लिखा था: http://marc.info/?m=97175526803720 :-P
  2. अपना स्वयं का syslog डिमन लिखें। यह /dev/log से डेटाग्राम को पकड़ने का एक साधारण मामला है! :- पी

ठीक है, ठीक है, तो ये दोनों मुखर जवाब हैं। क्या आपने syslogd प्रोफाइल किया है यह देखने के लिए कि यह सबसे ज्यादा कहां है?

4

नए डेमॉन लेखन में उतरने से पहले आप यह जांच सकते हैं कि syslog-ng तेज है (या तेज होने के लिए कॉन्फ़िगर किया जा सकता है) सादे पुराने syslog की तुलना में।

+0

rsyslog भी है। पता नहीं है कि यह तेज़ है, लेकिन यह कोशिश करने लायक हो सकता है। –

1

आप लॉगफाइल (यानी .: उपयोगकर्ता। * [टैब] -/var/log/user.log) के पथ से पहले एक minus डालकर, syynlogd के स्तर (या सुविधा) को अतुल्यकालिक रूप से लॉग इन करने के लिए कॉन्फ़िगर कर सकते हैं।

चीयर्स।

3

यदि आप लॉगिंग एप्लिकेशन पर स्रोत को नियंत्रित करते हैं तो आप एक चाल का उपयोग कर सकते हैं, जो कि syslog.conf की बजाय ऐप में लॉग स्तर को मास्क करना है। मैंने इस साल पहले एक ऐप के साथ किया था जिसने बड़ी, विशाल, बड़ी संख्या में डीबग लॉग उत्पन्न किए थे। उत्पादन कोड से कॉल को हटाने के बजाय, हमने बस मुखौटा किया ताकि डिबग स्तर कॉल कभी डिमन को नहीं भेजा गया हो। मुझे वास्तव में कोड मिला, यह पर्ल है लेकिन यह सेटलॉगस्क (3) कॉल के लिए सिर्फ एक मोर्चा है।

use Sys::Syslog; 
# Start system logging 
# setlogmask controls what levels we're going to let get through. If we mask 
# them off here, then the syslog daemon doesn't need to be concerned by them 
# 1 = emerg 
# 2 = alert 
# 4 = crit 
# 8 = err 
# 16 = warning 
# 32 = notice 
# 64 = info 
# 128 = debug 
Sys::Syslog::setlogsock('unix'); 
openlog($myname,'pid,cons,nowait','mail'); 
setlogmask(127); # allow everything but debug 
#setlogmask(255); # everything 
syslog('debug',"syslog opened"); 

सुनिश्चित नहीं हैं कि मैं क्यों बिटमास्क के बजाय दशमलव ... कंधे उचकाने की क्रिया के लिए इस्तेमाल किया

+0

मुझे यकीन नहीं है कि मैं इसे एक चाल कहूंगा, इस तरह आप इसे करना चाहते हैं, लेकिन मैं मानता हूं कि यह शायद व्यापक रूप से उपयोग नहीं किया जाना चाहिए। –

5

वहाँ syslog के प्रदर्शन में सुधार करने के लिए कई विकल्प हैं:

  • एक मैक्रो

    के साथ कॉल बाहर का अनुकूलन
    int LogMask = LOG_UPTO(LOG_WARNING); 
    #define syslog(a, ...) if ((a) & LogMask) syslog((a), __VA_ARGS__) 
    
    int main(int argc, char **argv) 
    { 
          LogMask = setlogmask(LOG_UPTO(LOG_WARNING)); 
          ... 
    } 
    

    उपयोग करने का एक लाभ syslog कॉल फ़िल्टर करने के लिए एक मैक्रो यह है कि संपूर्ण कॉल वैश्विक चर पर एक सशर्त कूद पर कम हो गया है, यदि आप में होते हैं तो बहुत उपयोगी है DEBUG कॉल जो अन्य कार्यों के माध्यम से बड़े डेटासेट का अनुवाद कर रहे हैं।

  • setlogmask()

    setlogmask(LOG_UPTO(LOG_LEVEL)) 
    

    setlogmask() के लिए/dev/log प्रवेश करने नहीं द्वारा कॉल को अनुकूलित करेंगे, लेकिन कार्यक्रम अभी भी तर्क के रूप में इस्तेमाल कार्यों कॉल करेंगे।

  • syslog.conf साथ छानने

    *.err            /var/log/messages 
    

    "जानकारी के लिए syslog.conf के लिए आदमी पृष्ठ देखें।"

  • कॉन्फ़िगर syslog अतुल्यकालिक या बफ़र लॉगिंग लॉग ऑन उत्पादन बफ़र और ब्लॉकों में यह प्लावित करने के लिए इस्तेमाल

    metalog क्या करना है। स्टॉक syslog और syslog-ng जहां तक ​​मुझे पता है, ऐसा मत करो।

0

syslog-async() कार्यान्वयन अन्य समय पर खोए गए लॉग लाइन/बाध्य विलंब के जोखिम पर मदद कर सकता है। http://thekelleys.org.uk/syslog-async/

नोट: 'एसिंक्रोनस' यहां आपके एप्लिकेशन के भीतर लॉग इवेंट को क्यूइंग करने का संदर्भ देता है, न कि अतुल्यकालिक syslogd आउटपुट फ़ाइल कॉन्फ़िगरेशन विकल्प जो अन्य उत्तरों का संदर्भ देता है।

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