2008-09-17 13 views
5

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

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

हालांकि एप्लिकेशन जावा में है, भाषा एक प्रतिबंध नहीं है; अंत में इसे लागू करने के लिए मुझे डिजाइन दिशानिर्देशों की आवश्यकता है। हम वर्तमान में log4j का उपयोग कर रहे हैं, लेकिन इससे यह व्यवहार नहीं मिल सकता है।

उत्तर

4

तुम भी log4j की nested diagnostic context सुविधा पर एक नजर है चाहिए। विभिन्न कॉलर्स के लिए लॉगर में विभिन्न संदर्भों को धक्का देना आपके लिए चाल कर सकता है।

+0

बहुत अच्छा, धन्यवाद !! –

+0

प्रलेखन के अनुसार, एनडीसी वर्तमान धागे से संलग्न है, इसलिए मुझे नहीं लगता कि इससे आपकी मदद मिलेगी। यह मूल रूप से धागे-स्थानीय भंडारण के शीर्ष पर एक रैपर है। –

+1

लेकिन एनडीसी वर्तमान संदर्भ को एक बच्चे धागे को पारित करने के तरीकों को प्रदान करता है, जो उपयोगी साबित हो सकता है। –

2

लॉग 4j में आप थ्रेड नाम को "% t" पैटर्न से लॉग कर सकते हैं। log4j Pattern Layout देखें।

0

Java5 (और बाद में) में आप कॉल कर सकते हैं

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); 

जो कुछ गहराई आप चाहते करने के लिए स्टैक ट्रेस निरीक्षण करें और तदनुसार लॉग इन करें।

जावा 1.4 में आप के साथ

StackTraceElement[] stackTrace = new Exception().getStackTrace(); 
+0

मैं स्टैक ट्रेस पर कॉल से बचना चाहता हूं, क्योंकि मैं जितना संभव हो उतना कम आक्रामक लॉगिंग करना चाहता हूं, और मैंने पढ़ा है कि स्टैक ट्रेस तक पहुंच बहुत महंगा है। जवाब के लिए धन्यवाद! –

0

आप धागे मुझे लगता है कि साथ लकड़हारा वस्तुओं संबद्ध करना चाहते हैं एक ही जानकारी मिल सकती है। एक ThreadLocal चर प्रत्येक थ्रेड के लिए एक log4j लकड़हारा उदाहरण पकड़े मदद कर सकता है:

http://java.sun.com/javase/6/docs/api/java/lang/ThreadLocal.html

4

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

संपादित करें: लॉग 4j में एमडीसी और एनडीसी कक्षाएं भी देखें। आप वहां संदर्भ डेटा जोड़ सकते हैं।

+0

यह एक अच्छा है, लेकिन मैं सभी इंटरफेस को संशोधित नहीं करना चाहता हूं। मैं ऐसा कुछ ढूंढ रहा था जिसने अधिक धागा इलाके का शोषण किया। धन्यवाद! –

+0

फिर थ्रेडलोकल के साथ संयोजन में इस दृष्टिकोण का उपयोग करें? –

+0

एमडीसी का जिक्र करने के लिए धन्यवाद। यही वह था जिसकी मैं खोज कर रहा था। – Knubo

0

आपको डेटा संरचना परत पर कुछ संरचना पारित करने की आवश्यकता होगी जो वर्तमान "गतिविधि" की पहचान करता है। आपके पास पहले से ही "गतिविधि" -क्लास हो सकता है जो समझ में आता है, आप लॉगर-इंस्टेंस का उपयोग Sunny suggested के रूप में कर सकते हैं या आप गतिविधि-संदर्भ का ट्रैक रखने के लिए तीसरी संरचना का उपयोग कर सकते हैं।

किसी भी मामले में, चूंकि आपकी "गतिविधि" को कई धागे में संसाधित किया जाता है, इसलिए आप मौजूदा "गतिविधि" का ट्रैक रखने के लिए थ्रेड-लोकल-स्टोरेज का उपयोग नहीं कर सकते हैं, जैसे कि अधिकांश अन्य मौजूदा उत्तरों सुझाव देते हैं। आपको इसे स्पष्ट रूप से चारों ओर पारित करने की आवश्यकता होगी।

मैं उस तरह

void debug(Activity activity, String message); 

तरीकों के साथ इंटरफेस का विस्तार log4j के शीर्ष पर एक छोटा सा मुखौटा बनाने और डेटा का उपयोग परत से इस में गतिविधि संदर्भ गुजर सुझाव है।

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

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

2

मेरे (वेब) अनुप्रयोगों में से एक में, मैं थ्रेडलोकल लॉगर का उपयोग करता हूं जो लॉगिंग जानकारी को स्ट्रिंगबिल्डर में कैप्चर करता है। लॉगर ऑब्जेक्ट को HttpServlet # सेवा विधि में प्रारंभ किया गया है, यदि कोई ट्रेस पैरामीटर सेट किया गया है (यदि यह सेट नहीं है, तो बहुत तेज नल-लॉगर है)। परिणामी आउटपुट या तो अनुरोध पृष्ठ में एक HTML टिप्पणी के रूप में डंप किया गया है, या एक सेगमेंट में लॉग फ़ाइल में लिखा गया है।

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