स्टडआउट का रोटेशन लॉग करें?


53

मेरे पास एक लिनक्स प्रोग्राम है जो stdout और stderr को जानकारी लिख सकता है।

मेरे पास एक शेल स्क्रिप्ट है जो उस आउटपुट को एक फ़ाइल में रीडायरेक्ट करती है /var/log। (वाया >>और 2>&1।)

क्या उस लॉग फ़ाइल को घुमाने का कोई तरीका है? (अधिकतम आकार, फिर किसी भिन्न फ़ाइल पर स्विच करें, केवल सीमित संख्या में फ़ाइलें रखें)

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


1
आप केवल स्क्रिप्ट को संशोधित क्यों नहीं कर सकते हैं जो रोटेशन के लिए तर्क को शामिल करने के लिए आउटपुट को पुनर्निर्देशित करता है?
MaQleod

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

2
आपको लॉगोटेट का उपयोग करने की आवश्यकता नहीं है, लेकिन लॉगरोटेट का उपयोग करने से बस समय की बचत होती है ... आमतौर पर पहिया को फिर से स्थापित करने के लिए बहुत कम बिंदु होते हैं।
बुबु

बिल्कुल मेरी बात। तो क्या एक चल रही प्रक्रिया के पुनर्निर्देशित स्टडआउट के साथ लॉगरोट काम करने का एक तरीका है?
मिरल

जवाबों:


44

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

  • डैन बर्नस्टीन multilogडैनमोंटूल से
  • multilogडेमोंटोल्स-एनकोर से ब्रूस Guenter
  • s6-logS6 से लॉरेंट बरकोट का
  • Gerrit पेप है svlogdRUNIT से
  • वेन मार्शल के tinylogपेर से
  • मेरे cyclogसे nosh

उपकरण के बाद प्रक्रिया- multilogलॉग लॉग फ़ाइल सेट में शामिल हैं, दूसरों के बीच में:

आगे की पढाई


1
धन्यवाद, multilogजैसा मुझे चाहिए वैसा ही दिखता है।
मिरल

मल्टिलॉग डेबियन में एकमात्र प्लग-एंड-प्ले समाधान लगता है (डेमोंटोलॉज़ में एक आधिकारिक पैकेज है)। लेकिन मेरे विशेष मामले में, जहां मैं एक fat32 विभाजन पर लॉग को स्टोर करना चाहता था, घूर्णन काम नहीं करता है, क्योंकि मल्टीगॉग एक सिम्लिंक का उपयोग करना चाहता है। मेरे लिए कोई प्लग एंड प्ले :)
अर्नौट

यह सच नहीं हो सकता है, जैसा कि multilogकहीं भी प्रतीकात्मक लिंक नहीं बनाता है या मांग करता है। यह उनके संबंध में पूरी तरह से तटस्थ है।
JdeBP

"इस सदी में लोगरोट या न्यूज़लॉग का उपयोग न करें" के URL में अतिरिक्त डॉट
6

15

rotatelogsअपाचे ( binदिर में) के साथ भेजा गया टूल ( डॉक्स देखें ) स्टड से इनपुट लेता है और कुछ समय के बाद लॉग को घुमा देता है


14

यदि आपके पास यह मानक लॉग स्ट्रीम (syslog, daemon, cron, उपयोगकर्ता, सुरक्षा, मेल, आदि) में से किसी एक पर जा सकता है, तो आप loggerइसके बजाय कमांड और पाइप का उपयोग कर सकते हैं ।

echo "Hello." | logger -p daemon.info

अन्यथा, आप अपनी लॉग इन की गई सामग्री को कस्टम प्रोग्राम या स्क्रिप्ट में रखने के लिए इसे संभालना या logrotateकॉन्फ़िगरेशन सेट करना बेहतर समझ सकते हैं।

EDIT: JdeBP के जवाब से लगता है कि आप क्या चाह रहे होंगे।


2
सादगी के लिए +1। BTW, आप मानक लोगों के बजाय एक कस्टम सुविधा (स्थानीय 0) को कॉन्फ़िगर कर सकते हैं (आपके उदाहरण में डेमन)
रोजर कीज़

14

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

चाल यह है ही काम करता है , तो पुन: निर्देशन के साथ "किया जाता है >> " (संलग्न) के बजाय "की > " (बनाने)।

फ़ाइल कॉन्फ़िगर करें (truncate.cfg):

/tmp/temp.log {
    size 10M
    copytruncate
    rotate 4
    maxage 100
}

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

cat /dev/urandom >> /tmp/temp.log

रनिंग लॉग रोटेट:

logrotate truncate.cfg

यह एक अच्छा सिद्धांत है, लेकिन यह वास्तव में किसी भी प्रणाली पर काम नहीं करता है जिसे मैंने इसे आजमाया है। फ़ाइल वास्तव में काट-छाँट नहीं करती है और कार्यक्रम पहले की तरह इसे आगे बढ़ाता है। (और हाँ, यह है कि पुनर्निर्देशन >> के माध्यम से किया साथ है।) ((BTW, यह जवाब पहले से ही पहले से दिया गया था)।)
Miral

1
... के रूप में logrotate में चर्चा मूल फ़ाइल (हमारे यूनिक्स और लिनक्स साइट पर) को छोटा नहीं करेगा । इसके अलावा, echo /dev/urandom >> /tmp/temp.log13 नियतात्मक चरित्र लिखेंगे /tmp/temp.logऔर फिर तुरंत बाहर निकल जाएंगे । क्या आपका मतलब था cat /dev/urandom?
जी-मैन का कहना है कि 'मोनिका'

2
बस यहाँ परीक्षण किया गया है, और यह काम करने लगता है। फ़ाइल की सामग्री को नई लॉग फ़ाइल में कॉपी किया जाता है। मूल फ़ाइल को प्रक्रिया द्वारा खुला रखा जाता है और इसे छोटा कर दिया जाता है (आकार अब 0 दिखाता है)।
फिलिप

1
Copytruncate के साथ संभावित डेटा हानि के बारे में सावधान रहें।
वँघ

1
+1 हालांकि "ध्यान दें कि फ़ाइल की प्रतिलिपि बनाने और उसे रौंदने के बीच बहुत कम समय का टुकड़ा है, इसलिए कुछ लॉगिंग डेटा खो सकता है।"
तगर

3

तो क्या एक चालू प्रक्रिया के पुनर्निर्देशित स्टडआउट के साथ लॉगरोट काम करने का एक तरीका है?

हाँ! Logrotate द्वारा की पेशकश की "copytruncate" निर्देश देखें। यह निर्दिष्ट करता है कि इस स्थिति को संभालने के लिए लोगरोट को निर्देश देता है: एक सरल प्रोग्राम जो अपनी लॉग फ़ाइल को अनिश्चित काल तक खुला रखता है।

आपकी स्थिति में एक समस्या हो सकती है या नहीं:

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

वास्तविक रूप से, मैंने कुछ "वास्तविक दुनिया" लॉग स्रोत देखे हैं जो उपयोगकर्ताओं को इस निर्देश को लागू करने के लिए प्रोत्साहित करते हैं। इस विकल्प की कुछ चर्चा यहाँ है


3

विभाजन का उपयोग करें, यह कोरुटिल का हिस्सा है। यह स्टड ले सकता है और इसे विखंडू (चंक आकार, या रेखाओं की संख्या, आदि के आधार पर) में विभाजित कर सकता है।

उदाहरण:

app | split --bytes 1G - /var/logs/put-prefix-here

नोट डैश (-) फ़ाइल के बजाय स्टड का उपयोग करने के लिए "विभाजन" का निर्देश देता है।


क्या आप ऐसा करने के लिए अपने उत्तर का विस्तार कर सकते हैं? धन्यवाद।
फिक्सर 1234

उदाहरण के साथ मेरे उत्तर को अपडेट किया।
नज़र

1G एक मनमाना आकार है, जिसके बाद यह एक नई फ़ाइल शुरू करता है?
फिक्सर 1234

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

1
@ डेविड रिचार्बी- कैसे जोड़ने के बारे में-अप्रभावित के लिए -u?
निक

3

मैं multilogअपने उपयोग के मामले के लिए पसंद करता हूं, लेकिन मेरा उपयोग मामला इतना तुच्छ / सरल है कि यह बहुत ही सरलता से / उदाहरणों में नहीं पाया जाता है जो मुझे मिला। यहाँ एक सरल मल्टीगॉग घूर्णन उदाहरण दिया गया है:

mkdir /tmp/myapp
./myapp | multilog t s10000 n5 '!tai64nlocal' /tmp/myapp 2>&1

कुछ नोट:

  • यह डंप उस / tmp / myapp / निर्देशिका में प्रवेश करता है
  • s10000 10,000 बाइट का प्रतिनिधित्व करता है *
  • n5 5 फ़ाइलों का प्रतिनिधित्व करता है। * 'वर्तमान' लॉग फ़ाइलों में से एक के रूप में गिना जाता है, इसलिए इसमें 4 पुराने लॉग + 'वर्तमान' शामिल हैं
  • यह फ्रैंकोइस ब्यूसोलिल द्वारा दिए गए उदाहरणों से अनुकूलित पर आधारित है: http://blog.teksol.info/pages/daemontools/best-practices
  • मुझे कई विकल्प समझ में नहीं आ रहे हैं - मैं आपको इसका विस्तार करने के लिए विभिन्न दस्तावेजों का संदर्भ देता हूं ...
  • डॉक्स चेतावनी देते हैं कि: "Note that running processor may block any program feeding input to multilog."जहां 'प्रोसेसर' '!tai64nlocal'कमांड का हिस्सा है

* कई अनुप्रयोगों के लिए, ये दीर्घकालिक उपयोग के लिए खराब विकल्प हैं। वे आपको बड़े लॉग करने की तुलना में लॉग को भरने और घुमाने के व्यवहार का निरीक्षण करने की अनुमति देते हैं।

अंत में, यदि आवश्यक हो तो nohup करने के लिए मत भूलना! Nohup के साथ, आपको 2>&1(s = 10e6 और n = 30 यहाँ) की आवश्यकता नहीं है:

mkdir -p /tmp/myapp
nohup ./myapp | multilog t s10000000 n30 '!tai64nlocal' /tmp/myapp &

वह आज्ञा आपको मिलनी चाहिए।


1

मैं सिर्फ सैम हेंडले की टिप्पणी को ऊपर जोड़ना चाहता था:

यह ट्रिक केवल तभी काम करती है जब रीडायरेक्ट (क्रिएट) के >>बजाय (अपेंड) के साथ किया जाता है >

मैं उसी समस्या में भाग गया, जहाँ मूल फ़ाइल सिर्फ आपके द्वारा उपयोग किए जाने >(बनाने) के लिए बढ़ती रहती है, लेकिन यदि आप >>(परिशिष्ट) Logrotate copytruncate का उपयोग सुन्दरता और अपेक्षित रूप से करते हैं। मूल फ़ाइल शून्य बाइट्स पर वापस जाती है और प्रोग्राम लिखना जारी रखता है।

रोटेटिंग लॉगफ़ाइल में STDOUT और STDERR को रीडायरेक्ट करें:

  1. some-program.sh >> /tmp/output.txt 2>&1 &
  2. /etc/logrotate.dमेरे मामले में जो भी, output_roll कहा जाता है, उसके तहत एक लॉगट्रेट कॉन्फिग फ़ाइल बनाएँ ।

    मेरे मामले के लिए नमूना विन्यास:

    /tmp/output.txt {
        notifempty
        missingok
        size 1G
        copytruncate
        start 0
        rotate 15
        compress
    }
    
  3. /etc/crontabफ़ाइल के अंदर अपना क्रॉन कार्य सेट करें

    *  *  *  *  * root /usr/sbin/logrotate /etc/logrotate.d/output_roll
    

    यह हर मिनट फ़ाइल की जाँच करेगा। आप अपनी आवश्यकताओं के अनुरूप समायोजित कर सकते हैं।

  4. इसे शुरू करो:

    $> service crond restart
    
  5. बस

नोट: मुझे SELinux से भी समस्या थी SELINUX=enforcingइसलिए मैंने इसे सेट किया SELINUX=disabled


1

मैंने इस सप्ताह के अंत में एक लोगो लिखा था । मैं शायद नहीं होता अगर मैंने @ JdeBP का शानदार उत्तर पढ़ा और multilog

मैंने इस पर ध्यान केंद्रित किया कि यह हल्का है और bzip2 को इसके आउटपुट विखंडू में सक्षम करने में सक्षम है:

verbosecommand | logrotee \
  --compress "bzip2 {}" --compress-suffix .bz2 \
  /var/log/verbosecommand.log

हालांकि अभी भी बहुत कुछ किया और परीक्षण किया जा रहा है।

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