2010-10-05 12 views
9

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

  1. इस डेटा को लॉग करने का सबसे अच्छा तरीका क्या होगा? एकल/एकाधिक फ़ाइल?
  2. इस लॉग का बैकअप लेने के लिए सबसे अच्छा तरीका क्या होगा?
  3. बैकअप फ़ाइल से डेटा पढ़ने और इसे कुछ उपयोगी रूप में बदलने का दृष्टिकोण क्या होगा? this और this तरह

कई धागे log4net और log4j सुझाव है, लेकिन मैं वास्तविक प्रक्रिया जानना चाहते हैं? साथ ही एक ही लॉग फ़ाइल में एकाधिक थ्रेड कैसे लिखते हैं? क्या प्रत्येक थ्रेड के लिए फ़ाइल स्तर लॉक आवश्यक है? यह सब कैसे काम करता है?

सभी विवरणों को समझने की दिशा में कोई सूचक की सराहना की जाएगी।

धन्यवाद।

+0

आमतौर पर लॉगिंग विधि सिंक्रनाइज़ की जाएगी ताकि आपको इसे एकाधिक धागे से एक्सेस करने की चिंता न हो। बैकअप के लिए, अधिकांश फाइल सिस्टम में फाइल सिस्टम स्तर पर छाया प्रतियां हैं - मुझे संदेह है कि आपको इस एप्लिकेशन के भीतर से चिंता करनी चाहिए। – Joey

+1

लॉगिंग फ्रेमवर्क का उपयोग करने का बिंदु बिल्कुल ठीक है कि यह आपको उन सभी विवरणों के बारे में चिंता करने से बचाता है। –

+0

@ माइकल बोर्गवर्ड: मैं आपका बिंदु देखता हूं लेकिन मैं विवरण जानना चाहता हूं। – understack

उत्तर

6

log4j जैसी लाइब्रेरी आपकी आवश्यकताओं के लिए कॉन्फ़िगर करने में सक्षम होगी। भी कई फाइलों में

  1. विभाजन यह मुश्किल कुछ मुद्दों डिबग करने के लिए कर देगा, लेकिन एक अखंड फ़ाइल होने मिश्रित प्रक्रियाओं की एक सूप छोड़ देता है। मेरे पास प्रत्येक परमाणु प्रक्रिया के लिए एक फ़ाइल होगी, यानी, एक मेल प्रबंधक अपनी लॉग फ़ाइल का उपयोग कर सकता है। जेडीबीसी के लिए अतिरिक्त डीबग जानकारी की अपनी लॉग फ़ाइल हो सकती है, लेकिन मुख्य एप्लिकेशन लॉग में त्रुटियों और प्रमुख घटनाओं की सूचना दी जाएगी।

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

  3. जहां तक ​​उपयोगिता को डीबग करने के लिए, आप रिपोर्ट करने के लिए "अपवाद" जैसे कुछ तारों के लिए grep कर सकते हैं। यदि आप आंकड़ों की तलाश में हैं, तो आपको अपने प्रक्रिया लॉग के अतिरिक्त उस विशिष्ट उद्देश्य के लिए लॉग बनाना चाहिए।

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

+0

+1 –

1

बिंदु 1 के संबंध में, मैं आमतौर पर एक ही फ़ाइल में सबकुछ (फीचर से संबंधित) लॉग करता हूं लेकिन लॉग लाइन में हमेशा कुछ संदर्भ जानकारी शामिल होती है जो मुझे संदर्भ/अनुरोध के प्रवाह (grep या कुछ और के माध्यम से) ट्रैक करने की अनुमति देती है।

उदाहरण (कॉल के साथ एक परिदृश्य):

DEBUG|CallID#12: Establishing new AUDIO call from AA to BB 
DEBUG|CallID#34: Call accepted by ZZ at ... 
DEBUG|CallID#99: Call terminated by callee (SS) 

इस तरह अगर कोई पूछता है कि यह "क्या पर 00:34 आज बी बी के लिए ए.ए. से कॉल करने के लिए क्या हुआ?" मैं बस एबी को बीबी (या यह समय हुआ) के लिए grep grep और फिर, एक बार जब मैं कॉल आईडी प्राप्त करता हूं, तो कॉल का पूरा विवरण प्राप्त करने के लिए बस आईडी के साथ grepping की बात है।

चैट, उपस्थिति इत्यादि जैसी अन्य चीजें अपनी फ़ाइल में जाएंगी (इस जानकारी को एक ही मोनोलिथिक फ़ाइल में मिश्रित करने के लिए ज्यादा समझ नहीं होगी)।

यदि आप प्रति थ्रेड (प्रति कार्य/अनुरोध के बजाय) चाहते हैं तो केवल उस थ्रेड का नाम लॉग करें जो कार्रवाई कर रहा है।

बिंदु 2 के संबंध में, log4j के साथ दैनिक रोटेशन।

सुनिश्चित नहीं है कि मैं बिंदु 3 समझ गया ... हो सकता है कि आप कुछ पैटर्न पुनर्प्राप्त करने के लिए एक लॉग फ़ाइल पार्स करें? रेगेक्स का समर्थन करने वाला कोई भी टूल चाल करेगा (grep सबसे आसान है)।

+0

http://logging.apache.org/log4j/1.2/manual.html "प्रदर्शन" पर नीचे स्क्रॉल करें। आपको कुछ संकेत देना चाहिए। एसिंक्रोनस लॉग का उल्लेख करने के लिए – biasedbit

1

जैसा कि ऊपर दी गई टिप्पणियां पहले से बताती हैं, लॉगिंग फ्रेमवर्क आपको निम्न स्तर के विवरणों के बारे में चिंता करने से मुक्त करने के लिए ठीक है। Log4J या इसके उत्तराधिकारी जैसे लॉगबैक कई धागे से सुरक्षित और प्रभावी ढंग से लॉगिंग को संभाल सकते हैं। आप बस लॉगिंग फ्रेमवर्क को बताएं कि लॉग इन करना है और कहां है, और यह सब काम करता है (आमतौर पर :-)

थ्रेड-विशिष्ट डेटा लॉगिंग के लिए, आप डायग्नोस्टिक संदर्भ का उपयोग करने पर विचार कर सकते हैं। यह earlier answer of mine लॉग 4 जे के लिए एक उदाहरण के साथ यह बताता है। लॉगबैक में, इसका नाम बदलकर Mapped Diagnostic Context कर दिया गया है।

बैकअप और पोस्ट-प्रोसेसिंग के लिए, सभी आपके वास्तविक लक्ष्यों पर निर्भर करते हैं। आम तौर पर सरल स्क्रिप्ट या gzip और grep जैसे एकल कमांड की आपको आवश्यकता होती है। ठोस जानकारी के बिना और बताना मुश्किल है।

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