मैं एक निदान लॉग होना चाहता हूं जो डेटा प्रबंधन के कई कार्यों द्वारा उत्पादित किया जाता है। ये कार्य एकाधिक धागे में हो सकते हैं। प्रत्येक कार्य को लॉग में एक तत्व (संभवतः उपखंडों के साथ) लिखने की आवश्यकता होती है; अंदर आ जाओ और जल्दी से बाहर निकलें। यदि यह एक एकल कार्य की स्थिति थी तो मैं XMLStreamWriter का उपयोग करता हूं क्योंकि यह स्मृति में एक गुब्बारे वाले XML दस्तावेज़ को पकड़ने के बिना सादगी/कार्यक्षमता के लिए सबसे अच्छा मिलान जैसा लगता है।एकाधिक धागे से जावा लॉगिंग के लिए सर्वोत्तम अभ्यास?
लेकिन यह एक एकल कार्य स्थिति नहीं है, और मुझे यकीन है कि कैसे सबसे अच्छा यकीन है कि यह "threadsafe", वह जगह है जहाँ "threadsafe" इस आवेदन में अर्थ है कि प्रत्येक लॉग तत्व सही ढंग से करने के लिए लॉग लिखा जाना चाहिए बनाने के लिए नहीं कर रहा हूँ और क्रमशः (एक के बाद एक और किसी भी तरह से interleaved नहीं)।
कोई सुझाव? मेरे पास एक अस्पष्ट अंतर्ज्ञान है कि जाने का तरीका लॉग तत्वों की कतार का उपयोग करना है (प्रत्येक व्यक्ति को जल्दी से उत्पादित करने में सक्षम है: मेरा एप्लिकेशन वास्तविक काम करने में व्यस्त है जो प्रदर्शन-संवेदनशील है), और एक अलग धागा है जो लॉग को संभालता है तत्व और उन्हें एक फ़ाइल में भेजता है ताकि लॉगिंग उत्पादकों को बाधित न करे।
लॉगिंग आवश्यक रूप से एक्सएमएल होना आवश्यक नहीं है, लेकिन मैं इसे संरचित और मशीन-पठनीय बनाना चाहता हूं।
संपादित करें: मैंने उद्धरणों में "थ्रेडसेफ" रखा है। Log4j स्पष्ट विकल्प (मेरे लिए नया लेकिन समुदाय के लिए पुराना) प्रतीत होता है, क्यों पहिया को फिर से शुरू करें ...
मुझे एक ही समस्या है, लेकिन वास्तविक समय में लॉग प्रदर्शित करने की आवश्यकता नहीं है (केवल सभी धागे निष्पादित करने के बाद)। मेरा समाधान प्रत्येक संदेश की शुरुआत में सिस्टम समय जोड़ना है, और उस समय उन्हें सॉर्ट करना है। – Fuhrmanator
सिस्टम समय सभी के बाद विश्वसनीय नहीं है - कुछ ऑपरेशन इतने करीब हैं कि उनके पास मिलीसेकंड में एक ही टाइमस्टैम्प है। सॉर्टिंग के परिणामस्वरूप ऑर्डर बदल सकता है। तो, मैंने कोशिश की एक और चीज Colllections.synchronizedList() का उपयोग संदेशों के स्ट्रिंग्स के एक ArrayList को लपेटने के लिए किया था। स्ट्रिंग में जोड़ना एक टाइमस्टैम्प दिखाता है कि यह तरीका भी सही नहीं है। मेरे मामले में कुछ संदेश ऑर्डर से बाहर थे (एक या दो मिलीसेकंड द्वारा), लेकिन संभवतः यह सिंक्रनाइज़ सूची में ऐड() कॉल के लिए कतार में देरी के कारण है। – Fuhrmanator