2011-09-21 16 views
5

हमें एक अनोखी समस्या का सामना करना पड़ रहा है। परिदृश्य: हमारे पास 3 सर्वर हैं जो एक घटक के कई उदाहरणों के साथ एक ही लॉग फ़ाइल में लेनदेन लॉग लिखते हैं। हम log4j और सर्वर 1.3 में चलाए गए सर्वर का उपयोग करते हैं। setAppend() को पारित किया गया है और कार्यान्वयन DailyRollingFileAppenderLog4j dailyrollingfileappender फ़ाइल समस्या

समस्या: मध्यरात्रि में, हम वर्तमान लॉग फ़ाइल को एक नए फ़ाइल नाम के साथ रोल करने और एक नई फ़ाइल में लिखना शुरू करने की उम्मीद कर रहे हैं। यह हमारे परीक्षण सेटअप (एकल सर्वर लेखन लॉग) में अच्छी तरह से काम कर रहा है। उत्पादन में, मध्यरात्रि में, नई फाइल बनाई जा रही है जहां नए लॉग लिखे जा रहे हैं लेकिन फ़ाइल पर लुढ़काया जा रहा है

किसी भी मदद की अत्यधिक सराहना की जाएगी क्योंकि यह कुछ दिनों के लिए है और हम किसी भी लीड नहीं प्राप्त कर पाएंगे समस्या।

+0

क्या आप अपनी कॉन्फ़िगरेशन फ़ाइल पोस्ट कर सकते हैं? –

+0

उत्तरों के लिए धन्यवाद। मुझे यहां एक और लिंक मिला है [http://vivekagarwal.wordpress.com/2008/02/09/missing-log4j-log-files-with-dailyrollingfileappender-when-they-should-roll-over/]। इसे आज़माएं और अपडेट करें – rajesh

+0

हमने उपरोक्त लिंक में दिए गए समाधान के साथ आगे बढ़े और यह काम किया। – rajesh

उत्तर

4

आप कई प्रक्रियाओं से एक ही फ़ाइल में लॉग इन नहीं होना चाहिए। Log4j थ्रेड-सुरक्षित है ठीक है, लेकिन यह प्रक्रिया-सुरक्षित नहीं है, अगर मैं ऐसा कह सकता हूं; यह विभिन्न जावा प्रक्रियाओं के बीच साझा लाइब्रेरी के रूप में काम नहीं करता है। एक जावा एप्लिकेशन में एम्बेडेड Log4j किसी अन्य का ज्ञान नहीं है।

रोल ओवर के साथ यह समस्या आप बस की खोज की है का कारण बनता है: सभी प्रक्रियाओं, अपने स्वयं के रोल ओवर कोड चलाने आँख बंद करके पिछले सामग्री को अधिलेखित (क्योंकि उनमें से कोई भी किसी भी उम्मीद है)।

एक संभावित यहाँ समाधान: Log4j Logging to a Shared Log File

+1

** FileAppender- आधारित वर्ग में अंतर्निहित फ़ाइल खोला गया है, संलग्न किया गया है, और सहेजे गए प्रत्येक लॉग भाग के साथ बंद ** क्या वाकई यह मामला है? मुझे बहुत ज़्यादा यकीन नहीं है। कम से कम यूनिक्स पर यदि आप किसी फ़ाइल में लॉग ऑन करते हैं और फिर इसे कमांड लाइन से छोटा कर देते हैं, तो आप अगली बार लिखेंगे कि फ़ाइल लिखने से पहले फ़ाइल को बाइनरी शून्य से गद्दीदार है। यह इंगित करेगा कि प्रत्येक लॉग इवेंट (जो महंगा होगा) पर फ़ाइल बंद नहीं होती है और खोला जाता है, लेकिन वास्तव में लिखने के बीच एक फ़ाइल सूचक बनाए रखा जाता है। संदेश एक साथ मिश्रित नहीं होते हैं क्योंकि अंतर्निहित फाइल सिस्टम पर अंतर्निहित लिखते हैं परमाणु हैं। – Tim

+0

आप सही हैं। याद रखें कि मैं लगभग 2 साल पहले क्या सोच रहा था, लेकिन मेरे सिद्धांत का समर्थन करने के लिए स्रोतों में कोई सबूत नहीं है। मैं अभी माफी मांग सकता हूं। – MaDa

2

हम एक ही समस्या में पड़ गए। मूल समस्या (। कई सर्वरों पर चल रहे इस मामले में) कई प्रक्रियाओं भर में फ़ाइल लॉग इन करने की यह बुरी चीजें के सभी प्रकार का मतलब पहुँच समन्वय करने के लिए कोई रास्ता नहीं है कि वहाँ हो रहा है: लॉग ओवरराइट हो जाता है, फ़ाइलों को रोल करने आदि असफल ...

मेरा सुझाव है कि प्रत्येक सर्वर एक अलग फ़ाइल को लिखना है, और फिर उन्हें पोस्ट प्रोसेसिंग जॉब में विलय करना है।

1

आप DailyRollingFileAppender कॉन्फ़िगर किया है के साथ दैनिक रोटेशन (यह रोटेशन के लिए हर घंटा, मिनट आदि विन्यस्त किया जा सकता) कहो। कहो, यह है 31-दिसम्बर 2014 आज और लॉग फ़ाइल नाम sample.log है। लॉग रोटेशन निम्न तरीके से होगा:

  • मध्यरात्रि के बाद प्राप्त होने वाला पहला लॉग संदेश (1-जनवरी-2015 को 1 बजे कहें) लॉग फ़ाइल रोटेशन ट्रिगर करेगा।
  • लॉग फ़ाइल रोटेशन पहले किसी भी मौजूदा फ़ाइल को पिछले दिन प्रत्यय से हटा देगा। (यानी यह नमूना-2014-12-31.log नाम से किसी भी फ़ाइल को हटा देगा। आदर्श रूप से ऐसी कोई फ़ाइल मौजूद नहीं होनी चाहिए।)।
  • फिर यह पिछले दिन के प्रत्यय के साथ वर्तमान फ़ाइल का नाम बदल जाएगा। अर्थात यह नाम बदलता sample.log करने के लिए नमूना-2014-12-31.log
  • यह प्रत्यय के बिना नई लॉग फ़ाइल बनाएगा। i.e. नया sample.log
  • यह नई फ़ाइल sample.log में लिखना शुरू कर देगा।

यदि लॉग प्रबंधक के दो उदाहरण एक ही लॉग फ़ाइल को इंगित करते हैं तो प्रत्येक उदाहरण स्वतंत्र रूप से उसी फ़ाइल पर उपरोक्त चरणों को दोहराएगा।यह निम्न में से किसी भी परिदृश्य में हो सकता है:

  • यदि एक ही कंटेनर में दो या दो से अधिक WAR फ़ाइल को उसी लॉग फ़ाइल में तैनात किया गया है।
  • यदि दो या दो से अधिक प्रक्रियाएं एक ही लॉग फ़ाइल को इंगित करती हैं।
  • आदि

इस तरह के परिदृश्य मुद्दा प्रश्न में उल्लेख किया जाता है।

  • एक विंडोज़ मशीन पर, एक बार पहले प्रक्रिया लॉग फ़ाइल घुमाया और नई फ़ाइल पर संभाल हासिल कर ली है, दूसरी लॉग appender लॉग लिखने के लिए असफल हो जायेगी।
  • लिनक्स मशीन पर, दूसरी प्रक्रिया पहली प्रक्रिया द्वारा बनाई गई संग्रह फ़ाइल को हटा देगी और पिछली दिन फ़ाइल में नई फ़ाइल (वर्तमान में पहली प्रक्रिया द्वारा उपयोग की जा रही) का नाम बदल जाएगी। इस प्रकार पहली प्रक्रिया पिछले दिन फ़ाइल में लॉग लिखना शुरू कर देगी, दूसरी प्रक्रिया नई फाइल में लॉग लिखेगी। आधी रात के बाद, पहली प्रक्रिया द्वारा उपयोग की जाने वाली लॉग फ़ाइल हटा दी जाएगी। तो, पहली प्रक्रिया से लॉग खोना जारी रहेगा।
+0

हम अपने वेब एप्लिकेशन में बहुत समान व्यवहार देख रहे हैं - अभी तक यह निर्धारित करना है कि हमारे पास संभावित रूप से एक से अधिक LogManager क्यों हैं। – sbarlster

+1

@ सब्स्स्टर - यह आमतौर पर तब होता है जब मशीन पर चलने वाली दो युद्ध फ़ाइलों (या दो स्टैंडअलोन प्रक्रियाओं) में एक ही लॉग फ़ाइल नाम होता है। – Bipul