रिंग-बफर में एक कमांड के स्टोर आउटपुट


16

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

कुछ इस तरह:

my-cmd | magic-command --output-file-template=my-cmd-%t \
                       --keep-bytes=1G \
                       --keep-time=3d \
                       --max-chunk-size=20M \
                       --compress=xz

लिखना होगा:

my-cmd-2014-09-05T10:04:23Z

जब यह 20M तक पहुंच रहा है, तो यह इसे संपीड़ित करेगा और एक नया खोल देगा, और इसी तरह, और थोड़ी देर बाद यह सबसे पुरानी फ़ाइलों को हटाना शुरू कर देगा।

क्या ऐसी आज्ञा मौजूद है?

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


"गिबिबाइट" क्या है?
पीटर मॉर्टेंसन

जवाबों:


6

आप पिपलोग के माध्यम से जो चाहें प्राप्त कर सकते हैं , जो "एक मध्यवर्ती के माध्यम से पाइपिंग द्वारा चल रही प्रक्रिया के लॉग को घुमाने या साफ़ करने की अनुमति देता है जो बाहरी संकेतों का जवाब देता है", जैसे:

spewstuff | pipelog spew.log -p /tmp/spewpipe.pid -x "gzip spew.log.1"

आप तब से पीआईडी ​​प्राप्त कर सकते हैं /tmp/spewpipe.pid, और:

kill -s USR1 $(</tmp/spewpipe.pid)

लेकिन आपको क्रोन या कुछ और के साथ स्थापित करना होगा। हालांकि, इसके लिए एक पकड़ है। सूचना I gzip spew.log.1- ऐसा इसलिए है क्योंकि -xलॉग को घुमाए जाने के बाद कमांड को निष्पादित किया जाता है। इसलिए आपको spew.log.1.gzहर बार ओवरराइट करने की समस्या है जब तक कि आप gzip करने के लिए एक छोटी स्क्रिप्ट न लिखें और फ़ाइल को बाद में स्थानांतरित करें, और -xकमांड के रूप में उपयोग करें ।

पूर्ण प्रकटीकरण: मैंने इसे लिखा था, इसलिए यह पूरी तरह से काम करता है । ;) मैं एक संक्षिप्त विकल्प को ध्यान में रखूंगा, या ऐसा कुछ जो इसे बेहतर बनाता है, संस्करण 0.2 के लिए (इसका उद्देश्य -xकुछ हद तक अलग है, लेकिन यह ऊपर के रूप में काम करेगा)। इसके अलावा स्वचालित रोलओवर एक अच्छा विचार है ... पहला संस्करण जानबूझकर न्यूनतम है क्योंकि मैंने उन सुविधाओं को जोड़ने के प्रलोभन का विरोध किया जो आवश्यक नहीं थे (यह सब के बाद, इसके लिए क्रोन नौकरी स्थापित करना इतना मुश्किल नहीं है)।

ध्यान दें कि यह पाठ आउटपुट के लिए अभिप्रेत है ; यदि संभावित अशक्त बाइट्स हैं, तो आपको उपयोग करना चाहिए -z- जो शून्य को कुछ और के साथ बदल देता है। कार्यान्वयन को आसान बनाने के लिए यह एक व्यापार था।


धन्यवाद। मैं आगे pipelog-0.3;-) देख रहा हूँ । मैं metacpan.org/release/File-Write-Rotate पर भी आया था । ध्यान दें कि फाइल साइज के आधार पर क्रोन जॉब्स को घूमने में ज्यादा मदद नहीं मिलेगी।
स्टीफन चेज़लस

आकार के आधार पर घूर्णन !? यह आउटपुट को फ्लश रखता है, इसलिए आप अंतराल पर फ़ाइल को स्टेट कर सकते हैं ...
गोल्डीलॉक्स

आप आकार को 20M (मेरी प्रश्न आवश्यकताओं के अनुसार) को मज़बूती से नहीं रख सकते।
स्टीफन चेज़लस

दूसरी बात यह है कि यह केवल बहुत अधिक पाठ है (मैंने उस बारे में एक अंतिम पैराग्राफ जोड़ा)।
गोल्डीलॉक्स

4

डैन बर्नस्टीन का मल्टीलॉग जाहिरा तौर पर ऐसा कर सकता है - या शायद इसमें से अधिकांश, फाइल डिस्क्रिप्टर के माध्यम से एक आउटलेट प्रदान करते हैं ! प्रोसेसर को आप जैसे चाहें अंतर बना सकते हैं - हालाँकि 20M / 1G आकार के विनिर्देशों में कुछ फ़िनालेग्लिंग हो सकती है क्योंकि यह 16M है! प्रति लॉग आउट सीमा। इस प्रकार, बहुमत में, ऊपर दिए गए लिंक से एक कॉपी + पेस्ट चयन, हालांकि लिंक अन्य विकल्पों जैसे कि प्रति पंक्ति टाइमस्टैम्पिंग का भी विवरण देता है, [एक] अन्य फ़ाइल को बनाए रखता है [s] जिसमें केवल सबसे हालिया लाइन मिलान पैटर्न और बहुत कुछ है ।

इंटरफेस

 multilog script

... स्क्रिप्ट में किसी भी तर्क की संख्या होती है। प्रत्येक तर्क एक क्रिया निर्दिष्ट करता है। इनपुट की प्रत्येक पंक्ति के लिए कार्रवाई की जाती है।

लाइनों का चयन

प्रत्येक पंक्ति को शुरू में चुना गया है। कार्य...

-pattern

... यदि रेखा रेखा से मेल खाती है, तो लाइन को अचयनित करता है। कार्य...

+pattern

यदि लाइन का चयन करता है पैटर्न लाइन मेल खाता है।

... पैटर्न सितारों और गैर-सितारों की एक स्ट्रिंग है। यह एक ही क्रम में सभी तारों और गैर-सितारों द्वारा मिलान किए गए तारों के किसी भी संयोजन से मेल खाता है। एक गैर-स्टार खुद से मेल खाता है। पैटर्न के अंत से पहले एक स्टार किसी भी स्ट्रिंग से मेल खाता है जिसमें पैटर्न में अगला चरित्र शामिल नहीं है। पैटर्न के अंत में एक स्टार किसी भी स्ट्रिंग से मेल खाता है।

स्वचालित रूप से घुमाए गए लॉग

अगर dir एक डॉट या स्लैश से शुरू होता है तो कार्रवाई ...

 dir

... एक लॉग नामित करने के लिए प्रत्येक चयनित रेखा भी संलग्न dir । अगर dir मौजूद नहीं है, तो multilogइसे बनाता है।

लॉग प्रारूप इस प्रकार है:

  1. dir एक निर्देशिका है जिसमें कुछ संख्या में पुरानी लॉग फाइलें, करंट नाम की एक लॉग फाइल , और अन्य फाइलों के लिए multilogअपने कार्यों पर नज़र रखने के लिए है।

  2. प्रत्येक पुरानी लॉग फ़ाइल का नाम @ से शुरू होता है , एक सटीक टाइमस्टैम्प के साथ जारी रहता है जब फ़ाइल समाप्त हो गई थी, और निम्नलिखित में से एक कोड के साथ समाप्त हो रही है:

    • .s : यह फ़ाइल पूरी तरह से संसाधित है और सुरक्षित रूप से डिस्क पर लिखी गई है।
    • .u : यह फ़ाइल एक आउटेज के क्षण में बनाई जा रही थी। हो सकता है कि इसे काट दिया गया हो। इसे संसाधित नहीं किया गया है।

कार्य...

 ssize

... बाद की dir क्रियाओं के लिए अधिकतम फ़ाइल आकार सेट करता है । multilogतय करेगा कि करंट काफी बड़ा है अगर करंट का आकार बाइट्स है। ( multilogयह भी तय करेगा कि वर्तमान काफी बड़ा है यदि यह अधिकतम फ़ाइल आकार के 2000 बाइट्स के भीतर एक नई पंक्ति देखता है; यह लाइन सीमाओं पर लॉग फ़ाइलों को समाप्त करने की कोशिश करता है।) आकार 4096 और 16777215 के बीच होना चाहिए। डिफ़ॉल्ट अधिकतम फ़ाइल आकार 99999 है।

0.75 और इसके बाद के संस्करण में: यदि multilogकोई ALRM सिग्नल प्राप्त करता है , तो यह तुरंत यह तय करता है कि करंट काफी बड़ा है, अगर करंट नॉनमेकट है।

(नोट: मुझे संदेह है कि यदि आवश्यक हो तो बिलिन को निर्दिष्ट अंतराल पर zsh scheduleभेजने के लिए आसानी से राजी किया जा सकता ALRMहै।)

कार्य...

 nnum

... बाद की dir क्रियाओं के लिए लॉग फ़ाइलों की संख्या निर्धारित करता है । नाम बदलने के बाद वर्तमान , अगर multilogदेखता संख्या या एक से अधिक वर्ष लॉग फाइल, यह छोटी से छोटी टाइमस्टैम्प के साथ वर्ष लॉग फ़ाइल को हटा। संख्या कम से कम 2 होनी चाहिए। लॉग फ़ाइलों की डिफ़ॉल्ट संख्या 10 है।

कार्य...

 !processor

... बाद की dir क्रियाओं के लिए एक प्रोसेसर सेट करता है । प्रोसेसर के माध्यम से करंटmultilog को फीड करेगा और आउटपुट को करंट के बजाय पुरानी लॉग फाइल के रूप में सेव करेगा । किसी भी आउटपुट को सेव करेगा जो प्रोसेसर डिस्क्रिप्टर 5 को लिखता है, और उस आउटपुट को डिस्क्रिप्टर 4 पर पढ़ने योग्य बनाता है जब वह अगली लॉग फ़ाइल पर प्रोसेसर चलाता है। विश्वसनीयता के लिए, प्रोसेसर को नॉनज़ेरो से बाहर निकलना चाहिए , अगर इसके उत्पादन को बनाने में कोई परेशानी हो; फिर इसे फिर से चलाएंगे। ध्यान दें कि रनिंग प्रोसेसर किसी भी प्रोग्राम फीडिंग इनपुट को ब्लॉक कर सकता है ।multilogmultilogmultilog


2

सबसे अच्छा मैं एक अनुमान के रूप में अब तक मिल सकता है जिसमें कोड के विशाल टुकड़े लिखना शामिल नहीं है zsh:

autoload zmv
mycmd |
  while head -c20M > mycmd.log && [ -s mycmd.log ]; do
    zmv -f '(mycmd.log)(|.(<->))(|.gz)(#qnOn)' '$1.$(($3+1))$4'
    {rm -f mycmd.log.1 mycmd.log.50.gz; (gzip&) > mycmd.log.1.gz} < mycmd.log.1
  done

यहाँ सबसे अधिक 51 20MiB बड़ी फ़ाइलों में विभाजित और घूर्णन किया गया है।


शायद ... loopmounts? btrfsभी साथ रखा जा सकता है compress-force=zlib
mikeserv

2

यहाँ एक हैक-अप अजगर स्क्रिप्ट है जो आप अनुरोध कर रहे हैं जैसे कुछ करने के लिए:

#!/bin/sh
''':'
exec python "$0" "$@"
'''

KEEP = 10
MAX_SIZE = 1024 # bytes
LOG_BASE_NAME = 'log'

from sys import stdin
from subprocess import call

log_num = 0
log_size = 0
log_name = LOG_BASE_NAME + '.' + str(log_num)
log_fh = open(log_name, 'w', 1)

while True:
        line = stdin.readline()
        if len(line) == 0:
                log_fh.close()
                call(['gzip', '-f', log_name])
                break
        log_fh.write(line)
        log_size += len(line)
        if log_size >= MAX_SIZE:
                log_fh.close()
                call(['gzip', '-f', log_name])
                if log_num < KEEP:
                        log_num += 1
                else:
                        log_num = 0
                log_size = 0
                log_name = LOG_BASE_NAME + '.' + str(log_num)
                log_fh = open(log_name, 'w', 1)

1
वहाँ एक खोल स्क्रिप्ट के execरूप में है कि अजगर pythonया env pythonहैशबैंग का उपयोग करने के बजाय पहली बात के रूप में है करने के लिए एक कारण है ?
19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.