2013-01-31 22 views
6

में केवल gzipped लॉग फ़ाइलों को जोड़ना मैं एक सेवा बना रहा हूं जहां मैं कई स्रोतों से एक सादे पाठ प्रारूप लॉग लॉग करता हूं (प्रति स्रोत एक फ़ाइल)। मैं इन लॉगों को घुमाने का इरादा नहीं रखता क्योंकि वे हमेशा के लिए आसपास रहना चाहिए।लेखन पाइथन

इन फ़ाइलों को हमेशा के लिए छोटे बनाने के लिए मुझे उम्मीद है कि मैं उन्हें फ्लाई में घुमा सकता हूं। चूंकि वे लॉग डेटा हैं, फाइलें बहुत अच्छी तरह से संपीड़ित होती हैं।

पाइथन में केवल एकमात्र gzipped टेक्स्ट फ़ाइलों को लिखने के लिए एक अच्छा दृष्टिकोण क्या है, ताकि जब सेवा चालू और बंद हो जाए तो लेखन को बाद में फिर से शुरू किया जा सकता है? मैं कुछ लाइनों को खोने के बारे में चिंतित नहीं हूं, लेकिन यदि gzip कंटेनर स्वयं टूट जाता है और फ़ाइल अपठनीय हो जाती है तो यह नहीं है।

इसके अलावा, अगर यह नहीं जाता है, तो मैं परेशानी के लायक नहीं होने पर उन्हें आसानी से सादे पाठ के रूप में लिख सकता हूं।

+1

भले ही आप लॉग घुमाने का इरादा नहीं रखते हैं, फिर भी आउटपुट तोड़ना क्यों नहीं और थोड़ी देर में एक नई फाइल शुरू करें? फिर फ़ाइल समाप्त होने के बाद आप gzip चला सकते हैं। –

+1

@ डेविडज़स्लावस्की का जवाब पारंपरिक समाधान है। यह केवल मानक लॉग रोटेशन है, सिवाय इसके कि आप उस हिस्से को छोड़ दें जहां आप पुरानी फाइलों को हटाते हैं। इस उद्देश्य के लिए 'logrotate' का उपयोग करने के तरीके को समझाते हुए लिंक के लिए – abarnert

उत्तर

8

नोट:

  • logrotate (घूमता है और, संपीड़ित करता है, मेल सिस्टम लॉग)

आप सेट कर सकते हैं: यूनिक्स प्रणालियों पर आप गंभीरता से एक बाहरी कार्यक्रम, इस सटीक काम के लिए लिखा उपयोग करने पर विचार करना चाहिए घूर्णन इतनी अधिक है कि पहली फ़ाइल in 100 years या तो हटा दी जाएगी।


अजगर 2 में, logging.FileHandler एक कीवर्ड तर्क encodingbz2 या zlib सेट किया जा सकता है कि लगता है।

इसका कारण यह है loggingusescodecs मॉड्यूल, जो बारी में व्यवहार करता है bz2 (या zlib) के रूप में एन्कोडिंग:

>>> import codecs 
>>> with codecs.open("on-the-fly-compressed.txt.bz2", "w", "bz2") as fh: 
...  fh.write("Hello World\n") 

$ bzcat on-the-fly-compressed.txt.bz2 
Hello World 

अजगर 3 संस्करण (हालांकि डॉक्स उपनाम के रूप में mentionbz2, आप वास्तव में bz2_codec - कम से कम w/3.2.3 का उपयोग करना होगा):

>>> import codecs 
>>> with codecs.open("on-the-fly-compressed.txt.bz2", "w", "bz2_codec") as fh: 
...  fh.write(b"Hello World\n") 

$ bzcat on-the-fly-compressed.txt.bz2 
Hello World 
+2

+1। (ठीक है, सिवाय इसके कि मैंने आपको पहले ही पाइथन में इसे कैसे करना है, यह समझाने के लिए +1 दिया है, यदि आप वास्तव में चाहते हैं ...) – abarnert

+1

लॉगप्रोटेट को हटा दिया क्योंकि मुझे लगता है कि यह करना सही होगा। – miku