जवाबों:
नहीं, ऑपरेटिंग सिस्टम जैसे लिनक्स, और यह फाइल सिस्टम है, फाइल की शुरुआत से डेटा हटाने का प्रावधान नहीं करता है। दूसरे शब्दों में, किसी फ़ाइल के लिए संग्रहण का प्रारंभ बिंदु निश्चित है।
फ़ाइल की शुरुआत से लाइनों को निकालना आमतौर पर एक नई फ़ाइल के लिए शेष डेटा को लिखने और पुराने को हटाने के द्वारा पूरा किया जाता है। यदि किसी प्रोग्राम में लिखने के लिए पुरानी फ़ाइल खुली है, तो उस फ़ाइल का विलोपन तब तक के लिए स्थगित कर दिया जाता है जब तक कि एप्लिकेशन फ़ाइल को बंद न कर दे।
जैसा कि टिप्पणीकारों ने उल्लेख किया है, मेरे पिछले वाक्य में दिए गए कारणों के लिए, आपको आमतौर पर लॉग्स लिखने वाले कार्यक्रमों के साथ लॉगफाइल प्रूनिंग को समन्वित करने की आवश्यकता होती है। वास्तव में आप यह कैसे करते हैं यह कार्यक्रमों पर निर्भर करता है। जब आप उन्हें एक संकेत (जैसे HUP) भेजते हैं तो कुछ प्रोग्राम्स उनके लॉगफ़ाइल्स को बंद और फिर से खोल देंगे और इसका उपयोग सेवा को बाधित किए बिना लॉग डिलीट करने के लिए लॉग रिकॉर्ड को रोकने के लिए किया जा सकता है।
लॉग फ़ाइलों के आकार को प्रबंधित करने के लिए कई उपयोगिताएँ उपलब्ध हैं, उदाहरण के लिए लॉगोट्रेट
कुछ कार्यक्रमों की अपनी उपयोगिताएँ हैं। उदाहरण के लिए, अपाचे वेबसर्वर में रोटेटलॉग्स उपयोगिता शामिल है ।
मुझे लगता है कि इस कार्य को हासिल किया जा सकता है sed
sed -i '1,10d' myfile
1 सेंट से 10 वीं पंक्ति तक की पंक्तियों को फ़ाइल के रूप में हटा देगा ।
मुझे लगता है कि हर किसी को कम से कम इस सीड 1 लाइनर्स पर एक नजर डालनी चाहिए ।
ध्यान दें कि यह लॉगफ़ाइल्स के लिए काम नहीं करता है जो एक एप्लिकेशन द्वारा सक्रिय रूप से जोड़ा जा रहा है (जैसा कि प्रश्न में कहा गया है)।
sed -i
एक नई फ़ाइल बनाएगा और उस फ़ाइल को 'डिलीट' करेगा जिसे लिखा जा रहा है। अधिकांश एप्लिकेशन हटाए गए लॉग फ़ाइल में लॉग रिकॉर्ड लिखना जारी रखेंगे और डिस्क स्थान भरना जारी रखेंगे। नई, छोटी, लॉग फ़ाइल को संलग्न नहीं किया जाएगा। यह तब ही बंद होगा जब आवेदन को फिर से शुरू किया जाएगा या अन्यथा इसकी लॉग फ़ाइलों को बंद करने और फिर से खोलने के लिए संकेत दिया जाएगा। जिस बिंदु पर नई लॉग फ़ाइल में एक अंतर (गुम लॉग रिकॉर्ड) होगा यदि सेड के उपयोग और एप्लिकेशन पुनरारंभ के बीच कोई लॉग करने योग्य गतिविधि हुई है।
ऐसा करने का एक सुरक्षित तरीका एप्लिकेशन को रोकना होगा, लॉग को कम करने के लिए sed का उपयोग करें, फिर एप्लिकेशन को पुनरारंभ करें। यह दृष्टिकोण कुछ सेवाओं के लिए अस्वीकार्य हो सकता है (उदाहरण के लिए उच्च प्रवाह और उच्च सेवा-निरंतरता आवश्यकताओं के साथ एक वेब-सर्वर)
sed -i
एक नई फ़ाइल बनाता है और पुराने को हटा दिया जाता है ताकि आप सक्रिय फ़ाइल को संपादित न कर रहे हों: $ ls -i --- 6823554 testfile --- $ sed -i 's/test/final/' testfile --- $ ls -i --- 6823560 testfile
------ कृपया जांचें कि यह कैसे sed -i
काम करता है । इस गलत जवाब में इतने सारे उभार क्यों हैं?
नहीं, लॉग फ़ाइल वृद्धि की इस सामान्य समस्या का समाधान लॉग रोटेशन है। इसमें नियमित (रात या साप्ताहिक, आम तौर पर) एक मौजूदा लॉग फ़ाइल को किसी अन्य फ़ाइल नाम पर ले जाना और एक खाली लॉग फ़ाइल के साथ नए सिरे से शुरू करना शामिल है। एक अवधि के बाद पुरानी लॉग फाइल को फेंक दिया जाता है।
देखें: http://www-uxsup.csx.cam.ac.uk/~jw35/courses/apache/html/x1670.htm
यह एक उत्तर है , समाधान नहीं। प्रश्न का कोई हल नहीं है। पूछने वाला स्पष्ट रूप से कहता है: "एक लॉग से जो सक्रिय रूप से एक एप्लिकेशन द्वारा जोड़ा जा रहा है "। आप अधिक समझने के लिए पढ़ सकते हैं, और एक सुझाव के लिए अंत में छोड़ सकते हैं जो मैं अपने अनुमान के आधार पर करता हूं कि यह कोड सबसे अच्छे अभ्यासों का पालन क्यों नहीं कर रहा है।
स्पष्ट होने के लिए: अन्य "उत्तर" यहां झूठे वादे की पेशकश करते हैं । नाम बदलने की कोई भी राशि नई फ़ाइल का उपयोग करके एप्लिकेशन को धोखा नहीं देगी। सबसे उपयोगी जानकारी इन गलत उत्तरों के लिए की गई टिप्पणियों में दफन है।
सक्रिय फ़ाइलें कुछ प्रकार के कंटेनर नहीं हैं जिन्हें आप केवल डेटा में डालते हैं। एक फ़ाइल एक इनोड (फ़ाइल की शुरुआत) को इंगित करता है और प्रत्येक इनोड में एक अन्य इनोड (यदि अधिक डेटा है) के लिए एक संकेतक है। इसका मतलब है कि एक निरंतर लिखित-फ़ाइल में एक निरंतर स्ट्रीम है जो इसमें जोड़ी जा रही है, और जिसे आप "फ़ाइल" समझते हैं, वह वास्तव में इनोड्स का लॉग अनुक्रम है।
कल्पना कीजिए कि आप Google मानचित्र पर किसी को ट्रैक कर रहे थे, और वह व्यक्ति दुनिया में कहीं भी, किसी भी समय टेलीपोर्ट कर सकता था, और आप अपने डॉट्स को कनेक्ट करने का प्रयास कर रहे थे।
लिनक्स टूल "ट्रंकट" फ़ाइल के अंत में डेटा को छोड़ सकता है, केवल इनोड ट्री को चलाकर और (जिस स्थान / आकार को आप पदनामित करते हैं) यह स्टैक के सभी बाद के बिंदुओं को छोड़ देगा। फ़ाइल की शुरुआत में डेटा को उल्टा करना - वास्तविक समय में इनोड ट्री को फिर से लिखने की इतनी जटिल और जोखिम भरी प्रक्रिया होगी कि कोई भी इस तरह के उपकरण जनता के लिए नहीं लिखेगा, क्योंकि वे अक्सर विफल होंगे और आगे बढ़ेंगे। डेटा हानि। Inodes विकी कम है लेकिन इन अवधारणाओं के कुछ बताते हैं।
** मेरी सलाह: इस समस्या को लगभग हल करें - यह आवेदन इस तरह से क्यों कर रहा है? कई लॉगिंग सर्वोत्तम प्रथाएं हैं लेकिन अक्सर वे कहते हैं कि आपका लॉगिंग सिस्टम वास्तव में क्या है (syslog, आदि)। कोर पर, एक एप्लिकेशन से अपेक्षा की जाती है कि वह "रिलीज़" हो, यह फ़ाइल के लिए हैंडल है, इसलिए लॉगोटेट (आदि) पुराने डेटा के आगे के प्रसंस्करण को संभाल सकता है।
जब भी मैं "एक्टीव लॉगफ़ाइल" सुनता हूं, तो मैं तुरंत उस व्यक्ति से मुझे इस एप्लिकेशन के पीछे "विशेष कहानी" बताने के लिए कहता हूं। आमतौर पर यह "डेवलपर छोड़ दिया है, और हम कोड को बदल नहीं सकते हैं। यह वास्तव में सुरक्षा का उलटा है, क्या यह जोखिमों का खुद का सेट है। लेकिन मैं आपको एक समाधान चाहता हूं जो स्रोत कोड को छूने से बचता है। यदि यह है। मामला, एक अधिक विशिष्ट प्रश्न की आवश्यकता है।
हो सकता है कि कॉपी करें, काटें, प्रतिलिपि कॉपी करें आकार पर वापस 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 से अंत तक दिखाता है
वैसे भी जहां चाह वहां राह।
समेककों के कई और जटिल उदाहरण और लिखने की धारा कैसे खोली या बंद की जा सकती है, प्रति सीपीयू कोर आदि को समायोजित करने की आवश्यकता हो सकती है, बस अगर आप लॉगिंग प्रक्रिया के अपने लकड़हारा आदि में लिख सकते हैं और कतार को रोक सकते हैं।