2010-04-07 13 views
10

हमारे ऐप सर्वर (वेबलॉगिक) सभी नेटवर्क शेयर पर उसी फ़ाइल पर लॉग इन करने के लिए log4j का उपयोग करते हैं। इसके शीर्ष पर हमारे पास एक प्रबंधित सर्वर लॉगिंग त्रुटियों में एक सामान्य त्रुटि.लॉग में सभी वेब ऐप्स हैं। मैं कल्पना नहीं कर सकता कि यह एक अच्छा विचार है लेकिन कुछ पेशेवरों से सुनना चाहता था। मुझे पता है कि प्रत्येक वेब ऐप का अपना क्लासलोडर होता है, इसलिए कोई थ्रेड सिंक्रनाइज़ेशन केवल ऐप के भीतर होता है। तो क्या होता है जब एकाधिक प्रक्रियाएं एक लॉग फ़ाइल पर अभिसरण शुरू होती हैं? क्या हम अलग-अलग लॉग स्टेटमेंट की उम्मीद कर सकते हैं? प्रदर्शन की समस्याएं? एक सामान्य लॉग फ़ाइल में लॉग इन करने वाले एकाधिक वेब ऐप्स के बारे में क्या? पर्यावरण सोलारिस है।एकाधिक ऐप्स/प्रक्रियाओं से एक लॉग फ़ाइल में लॉगिंग

+0

क्या आपने कोई वास्तविक लॉग भ्रष्टाचार अनुभव किया है? अगर कोई जवाब नहीं है तो मुझे आश्चर्य होगा, लेकिन अन्यथा मैं कल्पना नहीं कर सकता कि आप सवाल क्यों पूछ रहे हैं। – Yishai

+0

अभी तक कोई लॉग भ्रष्टाचार नहीं है, जिसे मैं जानता हूं। मैं पूछ रहा हूं क्योंकि मुझे विश्वास नहीं था कि उन्होंने इसे इस तरह से स्थापित किया था और मेरे संदेह की पुष्टि करने के लिए कुछ प्रतिक्रिया चाहते थे। – Andrew

+0

मुझे यह स्पष्ट करना चाहिए था कि एक लॉग फ़ाइल की आवश्यकता नहीं है; यह संयोग से अधिक डिजाइन था। कुछ ने एक लॉग फ़ाइल के लिए उचित तकनीक का उल्लेख किया है, नेटवर्क लॉग सेवा का उपयोग करना है, या प्रति सर्वर लॉगिंग के लिए एप्लिकेशन की सर्वर लॉग सेवा है। – Andrew

उत्तर

6

यह सामान्य रूप से बुरा विचार है कि फ़ाइल को लिखने के लिए सिंक्रनाइज़ नहीं किया गया है और निश्चित रूप से खराब प्रोग्रामिंग अभ्यास है। एकमात्र मामला यह काम कर सकता है स्थानीय मशीन पर एक फाइल में संलग्न है - हर कोई सिर्फ फाइल के अंत में लाइन जोड़ता है।

लेकिन, चूंकि आपकी फ़ाइल नेटवर्क शेयर पर है, इसलिए यह शायद कचरा में बदल जाएगी। आप बता नहीं था जो फाइल सिस्टम का उपयोग कर रहे वितरित, लेकिन एनएफएस के लिए आप खुले (2) आदमी पृष्ठ पर स्पष्टीकरण निम्नलिखित पा सकते हैं:

O_APPEND फ़ाइल संलग्न मोड में खोला गया है। प्रत्येक लिखने से पहले(), फ़ाइल ऑफसेट फ़ाइल के अंत में स्थित है, जैसे lseek() के साथ। O_APPEND को NFS फ़ाइल सिस्टम पर दूषित फ़ाइलों के लिए ले जा सकता है यदि एक से अधिक प्रक्रिया डेटा को एक बार में फ़ाइल में जोड़ती है। ऐसा इसलिए है क्योंकि NFS किसी फ़ाइल, में संलग्न करने का समर्थन नहीं करता है, इसलिए क्लाइंट कर्नेल को अनुकरण करना है, जो स्थिति के बिना नहीं किया जा सकता है।

बेशक यह सी है, लेकिन चूंकि जावा सी में लागू किया गया है, इसलिए इससे बेहतर नहीं हो सकता है (कम से कम सिस्टम कॉल के संबंध में नहीं :-))।

+0

मेरा मानना ​​है कि यह एनएफएस है लेकिन वे मुझे सर्वर के पास नहीं जाने देते हैं। तो एक ही फाइल में लॉग इन करने के लिए एक ही सर्वर में एकाधिक वेब ऐप्स के बारे में क्या? यह एक प्रक्रिया होगी। – Andrew

+0

एक प्रक्रिया, कई धागे यह अभी भी वही है। साथ ही, विभिन्न प्रक्रियाओं में अलग-अलग वेब ऐप्स लॉन्च नहीं किए गए हैं? वैसे भी, मेरे पास मेरे उत्तर की शुरुआत में काम करने का मौका है। लेकिन उस पर निर्भर होना एक बुरा विचार है। – pajton

+0

एक ही प्रक्रिया में चलने वाले सर्वर के सभी वेब ऐप्स। ठीक है, तो यह यूनिक्स स्तर पर सुरक्षित होगा, लेकिन फिर भी घुमावदार लॉगिंग प्राप्त कर सकता है। – Andrew

1

हम syslog का उपयोग करके एक मशीन पर लॉग इन करने के लिए org.apache.log4j.net.SyslogAppender का उपयोग करते हैं, और यह हमारे लिए अच्छा काम करता है। मैं इसे एक विकल्प के रूप में देखने की सिफारिश करता हूं।

+0

अच्छा सुझाव। मुझे लगता है कि कॉल असीमित हैं इसलिए अधिक प्रदर्शन दंड – Andrew

1

यह वास्तव में एक बुरा विचार (भ्रष्ट लॉग, किसी दिए गए लॉग प्रविष्टि के स्रोत की अनिश्चितता दिमाग में आने वाले दो कारण हैं) जैसा दिखता है। यदि आप इस तरह Weblogic में Log4j का उपयोग कर रहे हैं, तो मैं इसे by-the-book करने का सुझाव देता हूं। यह आपको बिना किसी समस्या के पूरे ऐप सर्वर के लिए एक फ़ाइल का उपयोग करने की अनुमति देगा।

लॉग लेखन को सिंक्रनाइज़ करने का सुझाव मुझे कोई समझ नहीं आता है, क्योंकि जब आप लॉग लिखते हैं तो आप मूल रूप से ऐप सर्वर में सभी एप्लिकेशन को अवरुद्ध कर देंगे। अगर लॉगिंग लगातार होती है, तो इससे सब कुछ धीमा हो जाएगा।

एकाधिक ऐप सर्वर के लिए, आपको फ़ाइल आधारित लॉगिंग के अलावा कुछ और उपयोग करने की आवश्यकता है यदि आप उन्हें समेकित करना चाहते हैं। ऐसा करने के कुछ तरीके हैं, एक अलग फाइलों पर लॉग इन करना है और एक अलग प्रक्रिया को गठबंधन करना है, लेकिन बेहतर विकल्प संभवतः नेटवर्क आधारित लॉगिंग रिपोजिटरी का उपयोग करना है, लॉग 4j के सॉकेट ऐपेंडर या किसी अन्य विधि का उपयोग करके (नाथन ने SyslogAppender का उल्लेख किया है यदि आप Syslog चाहते हैं तो यह बहुत अच्छा है) यह सुनिश्चित करने के लिए कि फ़ाइल का उपयोग दूषित नहीं होता है।

1

सर्वश्रेष्ठ मामला मुझे लगता है कि आपके पास लॉग फ़ाइल संसाधन में सिंक पहुंच के साथ संभावित प्रदर्शन समस्या है। सबसे खराब मामला आप जिन परिदृश्यों का उल्लेख करते हैं उनमें से कुछ होगा।

मैं दो प्रश्न पूछूंगा: ए) इस कॉन्फ़िगरेशन के साथ वांछित लक्ष्य क्या था और बी) क्या आप लक्ष्य प्राप्त करने के लिए एक बेहतर तकनीकी समाधान प्राप्त कर सकते हैं।

मेरा अनुमान है कि आपके पास एक sysadmin है जो "सिस्टम के लिए एकल लॉग फ़ाइल" प्राप्त करना चाहता है। फाइल को साझा करने में आसान बनाने के लिए नेटवर्क शेयर पर फेंक दिया जाता है। लक्ष्य के लिए बेहतर उत्तर एक अच्छी मॉनीटर के लिए प्रत्येक सिस्टम के लिए स्थानीय और http://www.splunk.com/ जैसी कई फाइलें हो सकती हैं।

0

यदि संभव हो तो प्रत्येक उदाहरण के लिए एक अलग फ़ाइल का उपयोग करें। यह कम से कम प्रयास के साथ सबसे अच्छा परिणाम देगा।

log4j के लॉगबैक विकल्प के पास अपने लॉग लेखक के लिए एक समझदार तरीका है जो स्पष्ट रूप से हुप्स के माध्यम से कूदता है ताकि यह सुनिश्चित किया जा सके कि फाइल के अंत में नई चीजें लिखी गई हैं। मुझे नहीं लगता कि नेटवर्क शेयरों पर काम करेगा।

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

+0

लॉगबैक का समझदार मोड नेटवर्क शेयरों पर काम करता है। कुछ सर्वर नोड्स के लिए, 4 या उससे कम कहें, यह काफी अच्छी तरह से काम करेगा। – Ceki

9

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

5

हमारे पास एक आवश्यकता है जहां हमें एक ही एप्लिकेशन चलाने वाले सभी प्रबंधित सर्वर से एक फ़ाइल बनाने की आवश्यकता है। हमने एक जावा लॉगिंग सर्वर विकसित किया जो एक बंदरगाह खोलता है और लॉग इवेंट के लिए सुनता है। हमने उसी पोर्ट पर लॉग इवेंट लिखने के लिए log4j socket appender का उपयोग किया और एक फ़ाइल बनाई।

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