लॉग फ़ाइल को एक प्रकार के परिपत्र बफर में बदलना


22

दोस्तों, वहाँ एक * निक्स समाधान है जो लॉग फ़ाइल को एक परिपत्र बफर के रूप में कार्य करेगा? उदाहरण के लिए, मैं अधिकतम 1Gb डेटा संग्रहीत करने और सीमा समाप्त होने के बाद पुरानी प्रविष्टियों को छोड़ने के लिए लॉग फ़ाइलें पसंद करूंगा।

क्या यह सभी के लिए संभव है? मुझे विश्वास है कि एक लॉग फ़ाइल को किसी विशेष उपकरण में बदल दिया जाना चाहिए ...

PS मुझे misc logrotating tools के बारे में पता है लेकिन यह वह नहीं है जिसकी मुझे आवश्यकता है। Logrotating के लिए बहुत सारे IO की आवश्यकता होती है, आमतौर पर दिन में एक बार होता है जबकि मुझे "रनटाइम" समाधान की आवश्यकता होती है।


3
मुझे यकीन नहीं है कि आपको क्यों लगता है कि लॉग रोटेशन को बहुत सारे IO की आवश्यकता होगी। 10 लॉगफ़ाइल्स को घुमाकर 10 नाम बदलना और सेवा का एक HUP है। बिल्कुल एक जानलेवा ऑपरेशन नहीं ... और यह आपकी समस्या का मानक समाधान है :)
pehrs

2
कोई स्क्रिप्ट / निष्पादन योग्य हो सकता है जो HUP के साथ अच्छी तरह से नहीं चलता है।
स्कॉट

1
यह आपके प्रश्न के लिए एक और उपयोग मामला प्रदान करना है। मेरे पास एक प्रदर्शन संगीत खिलाड़ी है। मुझे बस कई लाइनों की लंबाई चाहिए, इसलिए मैं देख सकता हूं कि क्या खेल रहा है, और इससे पहले क्या खेला था। A ऐसा tail -f somefileकरेगा। मैं सिर्फ घुमाए गए लॉग के साथ कोशिश की और tail -fउन लोगों के साथ काम नहीं करता है।
वोरैक

जवाबों:


14

लिनक्स में एक कर्नेल रिंग बफर होता है। आप इसे प्रदर्शित करने के dmesgलिए उपयोग कर सकते हैं ।

या यहाँ एक लिनक्स कर्नेल मॉड्यूल है जो कि आप जो चाहते हैं वह करने के लिए प्रकट होता है।

इमोशन क्या है?

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

Emlog कर्नेल मॉड्यूल सरल चरित्र डिवाइस ड्राइवर को लागू करता है। चालक एक नामित पाइप की तरह काम करता है जिसमें एक परिमित, परिपत्र बफर होता है। बफर का आकार आसानी से विन्यास योग्य है। जैसा कि अधिक डेटा बफर में लिखा गया है, सबसे पुराना डेटा खारिज कर दिया गया है। एक प्रक्रिया जो एक एम्लॉग डिवाइस से पढ़ती है, पहले मौजूदा बफर को पढ़ेगी, फिर नए टेक्स्ट को देखेगा जैसा कि लिखा गया है, "पूंछ -f" का उपयोग करके लॉग फ़ाइल की निगरानी के समान है। (यदि किसी डेटा को नए डेटा की प्रतीक्षा करने के लिए अवरुद्ध किए बिना लॉग की वर्तमान सामग्री प्राप्त करने की आवश्यकता है, तो गैर-अवरुद्ध रीडिंग भी समर्थित हैं।)


1
लिंक के लिए धन्यवाद! BTW, एम्लॉग होम पेज में ulogbufd का लिंक दिया गया है जो शायद मेरे लिए और भी अधिक उपयुक्त समाधान है।
पचंगा

Emlog कर्नेल मॉड्यूल अब GitHub पर बनाए रखा है: github.com/nicupavel/emlog
dbernard

4

निकटतम चीज जो मैं सोच सकता हूं, वह है आरआरडीटूल, लेकिन शायद यह वह नहीं है जो आप खोज रहे हैं। एक अन्य समाधान लॉग फ़ाइल की निगरानी करना होगा (हर सेकंड या लिनक्स में inotify के साथ कहें), जैसे आप एक स्क्रिप्ट लिखते हैं:

while :; do
  if [[ $(stat -c %s $FILE) -gt 10000 ]]; then
    # rotate the log
  fi
  sleep 1
done

inotify के साथ:

while :; do
  if inotifywait [some options] $FILE; then
    # check size and rotate the file
  fi
done

RRDtool का उल्लेख करने के लिए +1, रिंग डेटा संरचना लॉगिंग का एक वास्तविक उदाहरण है।
कोरी जे

उदाहरण के लिए धन्यवाद inotifywait शेल कमांड का उपयोग दिखा रहा है
pachanga

4

आप उपयोग कर सकते हैं multilog डीजेबी के Daemontools से। आप पाइप अपनी लॉग उत्पादन में यह। हाँ यह लॉग रोटेशन है, लेकिन रोटेशन बस हैं:

ln current $tai64nlocaltimestamp

जो, किसी भी आधुनिक लिनक्स फाइल सिस्टम के बारे में एक सुपर फास्ट ऑपरेशन है। आप निर्दिष्ट कर सकते हैं कि आप कितनी लॉग फ़ाइल चाहते हैं, आप उन्हें कितना बड़ा चाहते हैं। 10 x 1024mb फाइलें बनाएं, और आपके पास आपकी 1gb रिंग बफर होगी।

ध्यान दें, क्योंकि स्वचालित घुमाव के कारण, यह मल्टीलॉग उदाहरण प्रति एक स्रोत है। लेकिन आप उस के चारों ओर काम कर सकते हैं, नेटकैट या हाथ से एक साधारण आवरण लिखकर।


पारितोषिक के लिए धन्यवाद! मैं निश्चित रूप से मल्टीगॉग पर भी जा रहा हूं।
pachanga

1

आप एक फीफो पाइप बना सकते हैं और फिर उस से एक स्क्रिप्ट का उपयोग करके पढ़ सकते हैं जो एक डेटाबेस में सम्मिलित करता है। जब काउंटर 1,000 तक पहुंचता है, तो आईडी नंबर को डेटाबेस में डाला जा रहा है। निश्चित रूप से आकार के लिए काम नहीं करेगा, लेकिन आपने इसका इस्तेमाल एक उदाहरण के रूप में किया है, इसलिए मैं मान रहा हूं कि यह एक सैद्धांतिक सवाल है।


1

दिलचस्प सवाल; आप आमतौर पर एक डिजाइन के रूप में नहीं देखते हैं। मेरे पास एक कार्यक्रम है जो इतिहास को रिकॉर्ड करने के लिए एक समान रूप से तकनीक का उपयोग करता है, लेकिन यह एक द्विआधारी प्रारूप का उपयोग करता है। 'लॉग फ़ाइल' में चार भाग होते हैं, जो सभी मशीन-तटस्थ प्रारूप में रखे जाते हैं:

  1. एक हेडर जिसमें जादू की संख्या और प्रयुक्त सूची और मुफ्त सूची में प्रविष्टियों की अधिकतम संख्या होती है, अगली इतिहास प्रविष्टि के लिए अनुक्रम संख्या, प्रयुक्त सूची में प्रविष्टियों की वास्तविक संख्या, मुफ्त सूची में प्रविष्टियों की वास्तविक संख्या होती है। , और फ़ाइल की लंबाई (जिनमें से प्रत्येक 4 बाइट्स है)।
  2. उपयोग की गई सूची, प्रत्येक प्रविष्टि एक ऑफसेट और एक लंबाई (प्रत्येक प्रविष्टि के प्रत्येक भाग के लिए 4 बाइट्स)।
  3. मुफ्त सूची, प्रत्येक प्रविष्टि प्रयुक्त सूची प्रविष्टि के समान है।
  4. मुख्य डेटा, प्रत्येक इतिहास रिकॉर्ड एक शून्य टर्मिनेटर बाइट द्वारा समाप्त बाइट्स के एक सन्निहित सेट से मिलकर बनता है।

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

मुख्य कोड इतिहास कोड दो फाइलों में है, history.c. और history.h, प्रोग्राम से स्रोत के लिए उपलब्ध SQLCMD (मेरा संस्करण, Microsoft का नहीं; मेरा Microsoft से एक दशक या उससे अधिक पहले अस्तित्व में था), जिसे डाउनलोड किया जा सकता है इंटरनेशनल इनफॉर्मिक्स यूजर ग्रुप के सॉफ्टवेयर आर्काइव । एक इतिहास फ़ाइल डंप प्रोग्राम (histdump.c) और एक इतिहास परीक्षक भी है (histtest.ec - यह ESQL / C होने का दावा करता है, लेकिन क्या यह वास्तव में C कोड है; इसे कॉल करने वाले समर्थन कार्यों में से एक कुछ Informix ESQL / C का उपयोग करता है; पुस्तकालय कार्य)। यदि आप Informix ESQL / C का उपयोग किए बिना प्रयोग करना चाहते हैं तो मुझसे संपर्क करें - मेरी प्रोफ़ाइल देखें। इसके डिज़ाइन मिलियू के बाहर हिस्टेस्ट को संकलित करने के लिए इसके लिए कुछ तुच्छ परिवर्तन हैं, साथ ही आपको एक मेफाइल की आवश्यकता है।


0

मैं आपके सवाल पर pehrs की टिप्पणी से सहमत हूं। लॉग रोटेशन इतना कठिन नहीं है। आप अपनी लॉग फ़ाइल को समय-समय पर, भले ही आप चाहें तो लॉग लॉग या किसी अन्य स्क्रिप्ट की जांच कर सकते हैं। जब यह पता लगाता है कि आपकी फ़ाइल आकार में 1GB तक पहुंच गई है, तो यह केवल एक नाम बदलकर प्रदर्शन करता है, जो कि I / O के बगल में होता है। नाम बदलने के दौरान प्रक्रिया लॉग फ़ाइल लिखना जारी रखती है। लॉग रोटेटर तो (अपने डेमॉन अपने syslog डेमॉन के लिए एक HUP भेज सकते है , syslog के माध्यम से प्रवेश करने के है ना? यदि नहीं, तो यह HUP संकेत का समर्थन करना चाहिए यह अच्छी तरह से लिखा है कि अगर ...) यह मूल फ़ाइल पथ को फिर से खोलने के लिए । इस बिंदु पर यह मूल पथ पर एक नई फ़ाइल पर लिखना शुरू कर देगा और आप घुमाए गए संस्करण को हटा सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.