एक सक्रिय लॉग फ़ाइल से पहली एन लाइन्स निकालें


25

क्या Nएक लॉग से पहली पंक्तियों को हटाने का एक तरीका है जो किसी एप्लिकेशन द्वारा सक्रिय रूप से जोड़ा जा रहा है?

जवाबों:


10

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

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


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

लॉग फ़ाइलों के आकार को प्रबंधित करने के लिए कई उपयोगिताएँ उपलब्ध हैं, उदाहरण के लिए लॉगोट्रेट

कुछ कार्यक्रमों की अपनी उपयोगिताएँ हैं। उदाहरण के लिए, अपाचे वेबसर्वर में रोटेटलॉग्स उपयोगिता शामिल है ।


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

सच। भले ही आपने एक ही फाइलन का इस्तेमाल किया हो।
हेन्नेस

बहुत बुरा है OS आपको ऐसा नहीं करने देता, जो निश्चित रूप से लॉग रोटेटर्स के लिए सुविधाजनक होगा ताकि रोटेशन के बाद प्रक्रियाओं को फिर से लोड न करना पड़े: |
रोजरपैक

25

मुझे लगता है कि इस कार्य को हासिल किया जा सकता है sed

sed -i '1,10d' myfile

1 सेंट से 10 वीं पंक्ति तक की पंक्तियों को फ़ाइल के रूप में हटा देगा ।

मुझे लगता है कि हर किसी को कम से कम इस सीड 1 लाइनर्स पर एक नजर डालनी चाहिए

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

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

ऐसा करने का एक सुरक्षित तरीका एप्लिकेशन को रोकना होगा, लॉग को कम करने के लिए sed का उपयोग करें, फिर एप्लिकेशन को पुनरारंभ करें। यह दृष्टिकोण कुछ सेवाओं के लिए अस्वीकार्य हो सकता है (उदाहरण के लिए उच्च प्रवाह और उच्च सेवा-निरंतरता आवश्यकताओं के साथ एक वेब-सर्वर)


2
क्या आप जानते हैं कि जो एप्लिकेशन अप्लाई कर रहे हैं उनका क्या होता है?
एडम मटन

1
आइए एक सामान्य खुले फ़ाइल हैंडलर को मानें जो लाइनों को जोड़ता है और हर अब और फिर फ्लश करता है।
एडम मटन

1
मुझे पता है कि sed के आसपास मेरा रास्ता है, और एक नई फ़ाइल के लिए लाइनों को निकालना सेड के साथ एक नो-ब्रेनर है। समस्याओं को एक ही फाइल में रखना है।
एडम मटन

9
नहीं, यह काम नहीं करना चाहिए। संपादित सामग्री के साथ sed -iएक नई फ़ाइल बनाता है और पुराने को हटा दिया जाता है ताकि आप सक्रिय फ़ाइल को संपादित न कर रहे हों: $ ls -i --- 6823554 testfile --- $ sed -i 's/test/final/' testfile --- $ ls -i --- 6823560 testfile------ कृपया जांचें कि यह कैसे sed -iकाम करता है । इस गलत जवाब में इतने सारे उभार क्यों हैं?
पाबौक

1
प्रश्न कहता है "एक लॉग से जो सक्रिय रूप से एक एप्लिकेशन द्वारा जोड़ा जा रहा है"। ऑपरेटिव शब्द "सक्रिय रूप से" है। शायद आपका जवाब सामने आने के बाद यह स्पष्टीकरण जोड़ा गया। लेकिन जैसा कि यह खड़ा है, पाठकों को जो "सबसे ऊपर उठता है" के लिए गुमराह हो जाएगा। मैं केवल एक बार डाउनवोट कर सकता था।
Crossfit_and_Beer

5

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

देखें: http://www-uxsup.csx.cam.ac.uk/~jw35/courses/apache/html/x1670.htm


1

यह एक उत्तर है , समाधान नहीं। प्रश्न का कोई हल नहीं है। पूछने वाला स्पष्ट रूप से कहता है: "एक लॉग से जो सक्रिय रूप से एक एप्लिकेशन द्वारा जोड़ा जा रहा है "। आप अधिक समझने के लिए पढ़ सकते हैं, और एक सुझाव के लिए अंत में छोड़ सकते हैं जो मैं अपने अनुमान के आधार पर करता हूं कि यह कोड सबसे अच्छे अभ्यासों का पालन क्यों नहीं कर रहा है।

स्पष्ट होने के लिए: अन्य "उत्तर" यहां झूठे वादे की पेशकश करते हैं । नाम बदलने की कोई भी राशि नई फ़ाइल का उपयोग करके एप्लिकेशन को धोखा नहीं देगी। सबसे उपयोगी जानकारी इन गलत उत्तरों के लिए की गई टिप्पणियों में दफन है।

सक्रिय फ़ाइलें कुछ प्रकार के कंटेनर नहीं हैं जिन्हें आप केवल डेटा में डालते हैं। एक फ़ाइल एक इनोड (फ़ाइल की शुरुआत) को इंगित करता है और प्रत्येक इनोड में एक अन्य इनोड (यदि अधिक डेटा है) के लिए एक संकेतक है। इसका मतलब है कि एक निरंतर लिखित-फ़ाइल में एक निरंतर स्ट्रीम है जो इसमें जोड़ी जा रही है, और जिसे आप "फ़ाइल" समझते हैं, वह वास्तव में इनोड्स का लॉग अनुक्रम है।

कल्पना कीजिए कि आप Google मानचित्र पर किसी को ट्रैक कर रहे थे, और वह व्यक्ति दुनिया में कहीं भी, किसी भी समय टेलीपोर्ट कर सकता था, और आप अपने डॉट्स को कनेक्ट करने का प्रयास कर रहे थे।

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

** मेरी सलाह: इस समस्या को लगभग हल करें - यह आवेदन इस तरह से क्यों कर रहा है? कई लॉगिंग सर्वोत्तम प्रथाएं हैं लेकिन अक्सर वे कहते हैं कि आपका लॉगिंग सिस्टम वास्तव में क्या है (syslog, आदि)। कोर पर, एक एप्लिकेशन से अपेक्षा की जाती है कि वह "रिलीज़" हो, यह फ़ाइल के लिए हैंडल है, इसलिए लॉगोटेट (आदि) पुराने डेटा के आगे के प्रसंस्करण को संभाल सकता है।

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


-1

हो सकता है कि कॉपी करें, काटें, प्रतिलिपि कॉपी करें आकार पर वापस 0 = ट्रंकेशन, और प्रतिलिपि हटाएं?

टेल-कॉपी करने के लिए अभी तक बेहतर पूंछ, मूल पर ट्रंकट, मूल-प्रतिलिपि पूंछ।

आपको पूंछ की लंबाई में लॉग में लाइनें इतनी बेहतर मिलती हैं कि एक बाइट की लंबाई सीमा।

टिप्पणी से विवरण संशोधित करना:

पहले हमारे पास पाइथन 3 में एक लकड़हारा स्क्रिप्ट है जो आप चाहते हैं

from time import sleep

idx = 0
while 1 == 1:
    idx = (idx + 1)
    lf = open('tailTrunc.log', 'a')
    lf.write("line to file " + str(idx) + '\n')
    lf.close()
    sleep(0.01)

तब हमारे पास हमारा ट्रेंकुलेटर है

#!/usr/bin/env bash

trap "kill 0" EXIT

rm tailTrunc.log
touch tailTrunc.log

python3 logLoop.py &
loggerPID=$!
sleep 1

kill -STOP $loggerPID
tail -10 tailTrunc.log > trimEnd.log
truncate -s 0 tailTrunc.log
kill -CONT $loggerPID
sleep 1

trimEnd.log 80 से 89 दिखाता है

लॉग 90 से अंत तक दिखाता है

वैसे भी जहां चाह वहां राह।

समेककों के कई और जटिल उदाहरण और लिखने की धारा कैसे खोली या बंद की जा सकती है, प्रति सीपीयू कोर आदि को समायोजित करने की आवश्यकता हो सकती है, बस अगर आप लॉगिंग प्रक्रिया के अपने लकड़हारा आदि में लिख सकते हैं और कतार को रोक सकते हैं।


"एक लॉग से जिसे सक्रिय रूप से एक एप्लिकेशन द्वारा जोड़ा जा रहा है"। आपके समाधान की समस्या यह है कि लॉगफ़ाइल अनुप्रयोग द्वारा उपयोग में "स्थायी रूप से" है - जिसका अर्थ है कि लॉगफ़ाइल का इनोड खेलने में बना हुआ है। आपका समाधान लॉगफ़ाइल डेटा का "बैकअप" करता है, जिसका इस प्रश्न के बाहर उपयोग हो सकता है।
Crossfit_and_Beer

आपकी टिप्पणी और वोट के लिए धन्यवाद? मैंने एक त्वरित सस्ते उदाहरण में संशोधन किया है क्योंकि भोजन के लिए आपको अपनी स्थिति के बारे में अधिक गहराई से सोचना होगा, लेकिन जहां कोई रास्ता है वहां एक रास्ता होगा।
मास्टर जेम्स

मत सोचो कि यह मेरा डाउन वोट था, लेकिन मुझे लगता है कि अन्य उत्तर की टिप्पणियों में बिंदु अंकित है: यदि आप लॉगफ़ाइल की प्रतिलिपि बनाते हैं, तो यह अब सक्रिय लॉगफ़ाइल नहीं है ... कोई फर्क नहीं पड़ता कि आप क्या करते हैं। एप्लिकेशन का फ़ाइलहैंड हमेशा मूल लॉगफ़ाइल के इनकोड पर इंगित करेगा। इसे इस तरह से सोचें: आपके पास एक एप्लिकेशन है जो गैर-मानक लॉगिंग फ़ंक्शंस का उपयोग करता है, और लगातार बाइट को उस फ़ाइल में जोड़ता है जो उसके पास खुली है।
Crossfit_and_Beer

1
सही माफ करना। हाँ इनोड को वही रहने की आवश्यकता है, इसीलिए दिए गए उदाहरण / प्रमाण ट्रंकट का उपयोग करते हैं, और फिर से यह स्थिति पर निर्भर करता है (सभी के लिए विकल्प स्पष्ट रूप से सादे साइट में छिपे हुए हैं)।
मास्टर जेम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.