2008-10-01 6 views
61

में डेमॉन लॉगिंग इसलिए मेरे पास एक लिनक्स सिस्टम पर एक डिमन चल रहा है, और मैं इसकी गतिविधियों का रिकॉर्ड रखना चाहता हूं: एक लॉग। सवाल यह है कि इसे पूरा करने के लिए "सर्वश्रेष्ठ" तरीका क्या है?लिनक्स

मेरा पहला विचार बस एक फ़ाइल खोलना और लिखना है।

FILE* log = fopen("logfile.log", "w"); 
/* daemon works...needs to write to log */ 
fprintf(log, "foo%s\n", (char*)bar); 
/* ...all done, close the file */ 
fclose(log); 

क्या इस तरह से लॉग इन करने में स्वाभाविक रूप से गलत कुछ है? क्या कोई बेहतर तरीका है, जैसे लिनक्स में निर्मित कुछ ढांचे?

उत्तर

92

यूनिक्स के पास लंबे समय तक एक विशेष लॉगिंग फ्रेमवर्क है जिसे syslog कहा जाता है। अपने खोल

man 3 syslog 

पर टाइप करें और आपको सी इंटरफ़ेस के लिए सहायता मिल जाएगी।

Someexamples

#include <stdio.h> 
#include <unistd.h> 
#include <syslog.h> 

int main(void) { 

openlog("slog", LOG_PID|LOG_CONS, LOG_USER); 
syslog(LOG_INFO, "A different kind of Hello world ... "); 
closelog(); 

return 0; 
} 
+3

"आदमी 3 ..."! मुझे इसके बारे में पता नहीं था। – codemonkey

+4

यह ध्यान रखना दिलचस्प है कि इस आदरणीय उपकरण में परिवर्तन अब लिनक्स के लिए प्रस्तावित किए जा रहे हैं। देखें http://www.h-online.com/open/news/item/Journal-end-of-the-line-for-syslog-1382246.html –

+3

@VinkoVrsalovic लॉग कहाँ सहेजा गया है? धन्यवाद! – opc0de

0

संभावित मुद्दों का एक बहुत कुछ कर रहे हैं: उदाहरण के लिए, यदि डिस्क भरा हुआ है, तो आप अपने डेमॉन असफल करना चाहते हैं? साथ ही, आप हर बार अपनी फाइल को ओवरराइट कर देंगे। अक्सर एक गोलाकार फ़ाइल का उपयोग किया जाता है ताकि आपके पास अपनी फ़ाइल के लिए मशीन पर आवंटित स्थान हो, लेकिन आप पर्याप्त इतिहास लेने के बिना पर्याप्त इतिहास को उपयोगी बना सकते हैं। ऐसे लोगो हैं जैसे log4c जो आप की मदद कर सकते हैं। यदि आपका कोड सी ++ है, तो आप अपाचे प्रोजेक्ट में log4cxx पर विचार कर सकते हैं (apt-get liblog4cxx9-dev ubuntu/debian पर स्थापित करें), लेकिन ऐसा लगता है कि आप सी

21

यह संभवतः एक होने जा रहा है घोड़े की दौड़ थी, लेकिन हां syslog सुविधा जो सबसे अधिक मौजूद है यदि सभी अन * एक्स डेरिवेटिव नहीं जाने का पसंदीदा तरीका है। एक फ़ाइल में प्रवेश करने के साथ गलत कुछ भी नहीं है, लेकिन यह अपने कंधों पर कितने बजे है कार्यों में से एक नंबर:

  • आपकी लॉगिंग स्थान पर एक फाइल सिस्टम फ़ाइल
  • क्या बफरिंग के बारे में (प्रदर्शन के लिए बचाने के लिए है) बनाम फ्लशिंग (सिस्टम क्रैश से पहले लिखे गए लॉग प्राप्त करने के लिए)
  • यदि आपका डेमन लंबे समय तक चलता है, तो आप हमेशा बढ़ती लॉग फ़ाइल के बारे में क्या करते हैं।

Syslog आपके लिए यह सब कुछ और अधिक का ख्याल रखता है। एपीआई printf कबीले के समान है, इसलिए आपको अपने कोड को अपनाने में कोई समस्या नहीं होनी चाहिए।

8

मैं इकाई परीक्षण के दौरान daemon.info और daemon.debug पर बहुत सारे डिमन संदेशों को थूकता हूं। आपके syslog.conf में एक पंक्ति उन संदेशों को जो भी फाइल आप चाहें उसमें चिपका सकती है।

http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/040/4036/4036s1.html मैन पेज, आईएमओ की तुलना में सी एपीआई का बेहतर स्पष्टीकरण है।

2

जैसा ऊपर बताया गया है, आपको syslog में देखना चाहिए। लेकिन अगर आप अपना खुद का लॉगिंग कोड लिखना चाहते हैं तो मैं आपको फॉपेन के "ए" (एपेंड लिखना) मोड का उपयोग करने की सलाह दूंगा।

अपने स्वयं के लॉगिंग कोड लिखने में कुछ कमियां हैं: लॉग रोटेशन हैंडलिंग, लॉकिंग (यदि आपके पास एकाधिक थ्रेड हैं), सिंक्रनाइज़ेशन (क्या आप डिस्क पर लॉग के लिए लॉग इन करना चाहते हैं?)। Syslog की कमियों में से एक यह है कि एप्लिकेशन को पता नहीं है कि लॉग डिस्क पर लिखा गया है (वे शायद खो गए हों)।

2

Syslog एक अच्छा विकल्प है, लेकिन आप log4c को देखने पर विचार करना चाहेंगे। लॉग 4 [कुछ] ढांचे उनके जावा और पर्ल कार्यान्वयन में अच्छी तरह से काम करते हैं, और आपको कॉन्फ़िगरेशन फ़ाइल से - आपको syslog, console, flat files, या उपयोगकर्ता द्वारा परिभाषित लॉग लेखकों को लॉग इन करना चुनते हैं। आप अपने प्रत्येक मॉड्यूल के लिए विशिष्ट लॉग संदर्भों को परिभाषित कर सकते हैं, और प्रत्येक कॉन्फ़िगरेशन द्वारा परिभाषित अनुसार प्रत्येक संदर्भ लॉग को एक अलग स्तर पर लॉग कर सकते हैं। (ट्रेस, डिबग, जानकारी, चेतावनी, त्रुटि, आलोचनात्मक), और अपने डिमन को एक सिग्नल फँसाने से फ्लाई पर कॉन्फ़िगरेशन फ़ाइल को दोबारा पढ़ा है, जिससे आप चल रहे सर्वर पर लॉग स्तरों में हेरफेर कर सकते हैं।

11

बड़े (या अधिक सुरक्षा-जागरूक) प्रतिष्ठानों में syslog का एक अन्य लाभ: syslog डिमन को स्थानीय फाइल सिस्टम के बजाय (या इसके अतिरिक्त) रिकॉर्डिंग के लिए लॉग को अन्य सर्वर पर भेजने के लिए कॉन्फ़िगर किया जा सकता है।

प्रत्येक मशीन पर अलग-अलग पढ़ने के बजाय अपने सर्वर फार्म के लिए सभी लॉगों को एक स्थान पर रखना अधिक सुविधाजनक है, खासकर जब आप किसी सर्वर पर किसी अन्य सर्वर पर ईवेंट को सहसंबंधित करने का प्रयास कर रहे हैं। और जब कोई क्रैक हो जाता है, तो आप इसके लॉग पर भरोसा नहीं कर सकते ... लेकिन अगर लॉग सर्वर सुरक्षित रहे, तो आप जानते हैं कि इसके लॉग से कुछ भी नहीं हटा दिया जाएगा, इसलिए घुसपैठ का कोई रिकॉर्ड बरकरार रहेगा।

2

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

यह आपके सॉफ़्टवेयर में गंभीर मंदी के कारण लॉगिंग से बचाता है और यह डीबग लॉगिंग जोड़ने पर हेइज़नबग बनाने से बचाता है।

यदि इसमें उच्च स्पीड संपीड़ित बाइनरी लॉग प्रारूप है जो लॉगिंग के दौरान प्रारूप संचालन के साथ समय बर्बाद नहीं करता है और कुछ अच्छे लॉग पार्सिंग और डिस्प्ले टूल्स, यह एक बोनस है।

मैं इसके लिए कुछ अच्छे कोड का संदर्भ प्रदान करूंगा लेकिन मेरे पास एक नहीं है। मुझे बस एक चाहिए। :)

1

हमारे एम्बेडेड सिस्टम में सिसलॉग नहीं है, इसलिए मैं लिखने वाले डेमोन को "ए" ओपन मोड का उपयोग करके फ़ाइल में डिबगिंग करता हूं जैसा आपने वर्णन किया है। मेरे पास एक फ़ंक्शन है जो एक लॉग फ़ाइल खोलता है, संदेश को थूकता है और फिर फ़ाइल को बंद करता है (मैं केवल ऐसा करता हूं जब कुछ अप्रत्याशित होता है)। हालांकि, मुझे लॉग रोटेशन को संभालने के लिए कोड लिखना पड़ा क्योंकि अन्य टिप्पणीकारों ने उल्लेख किया है कि 'tail -c 65536 logfile> logfiletmp & & mv logfiletmp logfile' शामिल है। यह बहुत मोटा है और शायद "लॉग फ्रंटल ट्रंकेशंस" कहा जाना चाहिए लेकिन यह लॉग फ़ाइल के साथ भरने से हमारी छोटी रैम डिस्क आधारित फाइल सिस्टम को रोकता है।

1

अब तक कोई भी boost log library का उल्लेख नहीं करता है जिसमें फ़ाइलों को लॉग संदेश या syslog sink या यहां तक ​​कि विंडोज इवेंट लॉग को रीडायरेक्ट करने का अच्छा और आसान तरीका है।