लॉगरोट सफल, मूल फ़ाइल मूल आकार में वापस जाती है


11

क्या किसी के पास लॉगरोट के साथ कोई समस्या है इससे पहले कि लॉग फ़ाइल घुमाया जाए और फिर उसी आकार में वापस जाएं जो मूल रूप से था? यहाँ मेरे निष्कर्ष हैं:

लॉग स्क्रिप्ट स्क्रिप्ट:

/var/log/mylogfile.log {
    घूमना 7
    रोज
    संकुचित करें
    olddir / log_archives
    missingok
    notifempty
    copytruncate
}

लोगो लॉगोट का वर्बोज़ आउटपुट:

/var/log/mylogfile.log को /log_archives/mylogfile.log.1 पर कॉपी करना
truncating /var/log/mylogfile.log
के साथ लॉग इन करें: / बिन / gzip
पुराने लॉग / log_archives/mylogfile.log.8.gz को निकाल रहा है

Truncate होने के बाद लॉग फ़ाइल

[रूट @ सर्वर ~] # ls -lh /var/log/mylogfile.log
-rw-rw-r-- 1 part1 part1 0 जन 11 17:32/var/log/mylogfile.log

साहित्यिक रूप से बाद में:

[रूट @ सर्वर ~] # ls -lh /var/log/mylogfile.log
-rw-rw-r-- 1 part1 part1 3.5G Jan 11 17:32 /var/log/mylogfile.log

आरएचईएल संस्करण:

[रूट @ सर्वर ~] # बिल्ली / आदि / रेडहैट-रिलीज़ 
Red Hat Enterprise Linux ES रिलीज़ 4 (Nahant Update 4)

लोगरोट संस्करण:

[रूट @ DAA21529WW370 ~] # rpm -qa | grep logrotate
logrotate-3.7.1-10.RHEL4

कुछ नोट:

  • सेवा को मक्खी पर फिर से शुरू नहीं किया जा सकता है, इसलिए मैं कापीराइट का उपयोग कर रहा हूं
  • olddirप्रत्येक रात से लॉग फ़ाइल रखने वाली निर्देशिका के अनुसार, लॉग हर रात घूर्णन कर रहे हैं ।

जवाबों:


18

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

odc -c ट्रंकट + अचानक वृद्धि के बाद, उत्पन्न उत्पादन लाइनों के साथ:

0000000  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
33255657600  \0   C   K   B   -   s   e   r   v   e   r       [   h   t   t
33255657620 <more log output>

यह क्या कहता है ऑफसेट 0 से 33255657600 तक आपकी फ़ाइल में नल बाइट्स हैं, और फिर कुछ सुपाठ्य डेटा है। इस अवस्था में आने में उतना समय नहीं लगता जितना कि उन सभी अशक्त बाइट्स को लिखने में लगता है। Ext {2,3,4} फाइल सिस्टम स्पार्स फाइल्स नामक किसी चीज का समर्थन करता है, इसलिए यदि आप किसी ऐसी फाइल के एक क्षेत्र को खोजते हैं जिसमें कुछ भी नहीं है, तो उस क्षेत्र को शून्य-बाइट्स मान लिया जाएगा और जगह नहीं लेगा डिस्क पर। उन अशक्त बाइट्स को वास्तव में नहीं लिखा जाएगा, बस वहां होना माना जाता है, इसलिए 0 से 3.5GB तक जाने में लगने वाला समय बहुत अधिक समय नहीं लेता है। (आप कुछ ऐसा करके समय की मात्रा का परीक्षण कर सकते हैं dd if=${HOME}/.bashrc of=largefile.bin seek=3432343264 bs=1, यह कुछ मिलीसेकंड में 3GB से अधिक की फ़ाइल उत्पन्न करना चाहिए)।

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


मुझे ऐसा नहीं लगता - सेकंड में, लॉग फ़ाइल 0 बाइट्स से 3.5GB तक जाती है। कुल लोगो को पूरा करने में लगने वाला कुल समय लगभग 5 मिनट है। लॉग फ़ाइलों को उस तेज़ पर नहीं लिखा गया है और आकार हमेशा मूल आकार होता है, जो बहुत अधिक संयोग लगता है।
drewrockshard

इसे सत्यापित करने का एक आसान तरीका होना चाहिए, फ़ाइल का निरीक्षण करें और देखें कि क्या वास्तव में इसमें कुछ है। Od -c filename चलाकर शुरू करें | हेड -n 100. संभावना है कि यह आपको कुछ लाइनों में बताएगा कि नल-बाइट्स का एक ट्रक लोड है, साथ ही नवीनतम लॉग-एंट्रीज भी हैं।
Kjetil Joergensen

यदि यह मामला है, तो क्या हम परीक्षण कर सकते हैं कि क्या cat / dev / null> /var/log/mylogfile.log एक तरह से फ़ाइल को काटता है जो इस समस्या को हल करता है, बजाय इसके कि कॉपीराइटट्रैक में निर्मित लॉगोटेट का उपयोग करने के बजाय?
mtinberg

2
फ़ाइल जिस तरह से काट-छाँट की जाती है, उसके साथ समस्या नहीं होती है, समस्या यह है कि प्रोग्राम लॉगफ़ाइल को कैसे लिखता है। एक व्यवहार्य दृष्टिकोण होने के लिए लॉगफाइल को रौंदने के लिए, आपको प्रोग्राम लेखन को किसी भी तरह से स्थिति में लाना होगा 0. यह संभव है कि एक फाइल सिस्टम जो विरल फाइलों का समर्थन नहीं करता है, उसमें यह समस्या नहीं होगी, हालांकि मैं डॉन अभी परीक्षण का कोई तरीका नहीं है।
Kjetil Joergensen

1
यह अंतिम जवाब वास्तव में अधिक समझ में आता है और फिक्स शायद आवेदन को पुनरारंभ करने के लिए समाप्त हो जाएगा।
२१:

2

मैं कर रहा हूँ बहुत विश्वास है कि Kjetil यह मारा गया है। आकर्षित किया, आप अभी तक उसके स्पष्टीकरण से आश्वस्त नहीं हो सकते हैं लेकिन मैं आपको ध्यान से पढ़ने का आग्रह करता हूं कि उसने क्या कहा है।

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

ErrorLog "|/usr/sbin/rotatelogs /www/logs/error_log 604800"

जो की तरह नाम के साथ लॉग लॉग का एक बहुत का कारण बनता है

-rw-r--r--    1 root     root         4078 Dec 21 01:04 error_log.1292457600
-rw-r--r--    1 root     root         4472 Dec 29 08:41 error_log.1293062400
-rw-r--r--    1 root     root        78630 Jan  4 12:57 error_log.1293667200
-rw-r--r--    1 root     root        15753 Jan 12 01:10 error_log.1294272000

अपाचे को पुनरारंभ किए बिना प्रकट होने के लिए; मैं इस तथ्य के बाद उन्हें मैन्युअल रूप से संपीड़ित कर सकता हूं। ध्यान दें कि रोटेशन हर हफ्ते कैसे होता है, जो हर 604800 सेकंड में होता है, इस तर्क को पारित किया जा रहा है rotatelogs

यदि आप ऐप को रोक और पुनः आरंभ नहीं कर सकते हैं, और यह पाइप से लॉग इन नहीं कर सकता है, तो मुझे लगता है कि आपको एक वास्तविक समस्या मिल गई है। शायद दूसरों के सुझाव होंगे।


0

यह वास्तव में बहुत अच्छा होगा यदि आप पूरे लोगो को भेज सकते हैं।

किल -HUP का उपयोग करने का प्रयास क्यों करें? (शास्त्रीय पुनः लोडिंग पुनः आरंभ नहीं ) विधि।

इसके अलावा ... जाँचें कि lsof कौन फ़ाइल तक पहुँच रहा है।


kill -HUPइस एप्लिकेशन का उपयोग किसी भी तरह से नहीं किया जा सकता है - यह एक संवेदनशील एप्लिकेशन है जो मेरे पास नहीं है (मैं इसे प्रबंधित भी नहीं करता हूं - मैं केवल ओएस पक्ष का प्रबंधन करता हूं) इसलिए मुझे इसे लॉग इन करने में सक्षम होने की आवश्यकता है मार्ग।
Drewrockshard

1
क्षमा करें, मूल संदेश जल्दी सबमिट कर दिया गया, यहाँ मेरा मूल संदेश शेष है: मैंने आज सुबह सिस्टम में लॉग इन किया और निर्धारित लॉग इन /etc/cron.dailyआरंभ होने के बाद फ़ाइल अब वापस सामान्य हो गई है। सभी के लिए प्रश्न: क्या कुछ ऐसा है जो लॉग इन स्क्रिप्ट को लॉग लॉग को चलाने से अलग करता है? मेरी लॉगरोट स्क्रिप्ट सचमुच की तरह दिखती है /usr/sbin/logrotate /etc/logrotate.conf। यह काफी चौंकाने वाला है।
drewrockshard

-1

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

SomeScript.sh >> output.txt

उम्मीद है कि स्पष्ट है।


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

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