2011-06-28 9 views
8

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

मैं जावा से सुनने के अन्य विकास प्लेटफार्मों के लिए टिप्पणी/जवाब एक तरफ, में रुचि होगी।

उत्तर

8

आप बस समय-समय पर करीब है और फिर से खुला अपने एप्लिकेशन पर लॉग फ़ाइल की जरूरत है। आपको एक हैंडलर चाहिए जो आखिरी बंद समय रखता है। हैंडलर को फ़ाइल को बंद करना और फिर से खोलना चाहिए (उदाहरण के लिए) अंतिम बंद होने के बाद से 20 सेकंड बीत चुके हैं और लॉग प्रविष्टि लिखी जा रही है। लॉग प्रविष्टि

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

लॉग (फ़ाइल नाम का उपयोग करके) को बंद करना और फिर से खोलना सुनिश्चित करेगा कि अगर फ़ाइल का नाम बदल दिया गया है तो एक नया बनाया जाएगा। प्रत्येक बार लॉग लिखा जाने पर फ़ाइल को बंद करना और फिर से खोलना एक ओवरकिल है क्योंकि फ़ाइल खोलना एक महंगा ऑपरेशन है।

0

मैं कुछ अन्य एप्लिकेशन को देखा और जाहिरा तौर पर एक postrotate विकल्प और एक copytruncate option है। Copytruncate विकल्प आसान है, लेकिन मुझे लगता है कि यह कम विश्वसनीय है क्योंकि बफर को फ्लश नहीं किया जा सकता है (यानी @ जेरेक पोटिक उत्तर का पालन करें) और यहां तक ​​कि यदि वे हैं तो आपको डुप्लिकेट प्रविष्टियां या गिराए गए प्रविष्टियां मिल सकती हैं।

postrotate विकल्प आपको एक आदेश फ़ाइल (करीब और उसके बाद खुला) को फिर से खोलने के लिए आपके आवेदन को बताने के लिए चलाने के लिए अनुमति देता है:

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

चलें अपने अनुप्रयोग मान myapp कहा जाता है:

/var/log/myapp/*.log { 
     weekly 
     missingok 
     rotate 20 
     compress 
     delaycompress 
     notifempty 
     sharedscripts 
     postrotate 
      /etc/init.d/myapp rotate-logs > /dev/null 
     endscript 
} 

आदेश /etc/init.d/myapp rotate-logs को बंद करने और लॉग को फिर से खोलने के लिए एप्लिकेशन को यह संकेत दे करने की आवश्यकता होगी:

आप एक फ़ाइल /etc/logrotate.d/myapp में की तरह कुछ के साथ होता है फ़ाइलें।

सिग्नलिंग हिस्सा काफी मुश्किल है और यह निर्भर करता है कि आपके पास किस तरह का ऐप है क्योंकि जावा आईपीसी का समर्थन नहीं करता है (यानी यूनिक्स सिग्नल) ताकि आपको पोर्ट खोलना पड़े या मौजूदा पोर्ट का उपयोग 8080 (यानी एक सर्वलेट कंटेनर के मामले में HTTP REST कमांड) लॉग इन फ़ाइलों को बंद करने और फिर से खोलने के लिए अपने ऐप को बताने के लिए।

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