Nginx लॉग को घुमाने का उचित तरीका


12

मैं nginx लॉग के रोटेशन को प्राप्त करना चाहूंगा जो:

  1. बिना किसी अतिरिक्त सॉफ्टवेयर के काम करेगा (यानी - "लॉगरोट के बिना सबसे अच्छा")
  2. दिनांक के आधार पर नामों के साथ घुमाए गए फ़ाइलों को बनाएगा

सबसे अच्छा तरीका कुछ ऐसा है जैसे PostgreSQL में - यानी इसके log_filename config वेरिएबल में मैं strftime-style% Y-% m-% d निर्दिष्ट कर सकता हूं, और यह स्वतः लॉग ऑन डेट (या समय) बदल जाएगा।

अपाचे से एक और दृष्टिकोण - रोटेटलॉग्स प्रोग्राम के लिए पाइप के माध्यम से लॉग भेजना।

जहाँ तक मैं खोज करने में सक्षम था - ऐसा कोई दृष्टिकोण मौजूद नहीं है। मैं बस इतना कर सकता हूं, डेटट्रैक विकल्प के साथ लॉगरोट का उपयोग करना है, लेकिन इसमें कमियों का अपना सेट है, और मैं कुछ ऐसा काम करता हूं जो पसंद है। Rotgogogs या log_filename PostgreSQL में।


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

logrotate (डेटेक्स के साथ) लगभग काम करता है, लेकिन मुझे यह पसंद नहीं है क्योंकि इसे क्रोन के माध्यम से चलाया जाना है, और इसमें कुछ कमियां हैं।

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

जवाबों:


7

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

यहाँ क्रोनोलॉग का उपयोग करके एक उदाहरण दिया गया है access.log:

  1. हमारे नामित पाइप के लिए एक रास्ता चुनें। मैं अपना लॉग इन रखने का इरादा रखता हूं /var/log/nginx, इसलिए मैं अपने पाइप वहां भी डालूंगा। नाम आपके ऊपर है; मैं जोड़ता हूं .fifo, और यह है access.log, तो मेरा होगा /var/log/nginx/access.log.fifo
  2. मौजूद होने पर फ़ाइल को हटा दें।
  3. लॉगफ़ाइल के लिए एक नामांकित पाइप बनाएं:

    mkfifo /var/log/nginx/access.log.fifo
    
  4. nginx.confआपके द्वारा अभी बनाए गए पाइप पर लॉग को इंगित करने के लिए कॉन्फ़िगर करें:

    access_log /var/log/nginx/access.log.fifo;
    
  5. सर्वर शुरू करने से पहले पाइप को सुनने वाले लॉग रोटेटर को शुरू करने के लिए अपनी init.d स्क्रिप्ट को संशोधित करें :

    LOGS="/var/log/nginx"
    pkill -f "/usr/sbin/cronolog --symlink $LOGS/access.log"
    ( cat $LOGS/access.log.fifo | /usr/sbin/cronolog --symlink $LOGS/access.log "$LOGS/%Y/%m/%d/access.log" ) &
    

    इसी तरह की एक कमांडलाइन का उपयोग किया rotatelogsजाना चाहिए जिसे आप इसे पसंद करते हैं cronolog- सिंटैक्स के लिए उनके डॉक्स देखें।

    यदि आपके विकृति में एक है start-stop-daemon, तो आपको इसके बजाय इसका उपयोग करना चाहिए, क्योंकि यह सैद्धांतिक रूप से आपके प्लेटफॉर्म के बारे में जो भी विशेष जानकारी है, और pkillआपके लिए देखभाल कर रहा है। बस एक स्क्रिप्ट में कमांड लपेट, और के रूप में इसे पारित --execकरने के लिए start-stop-daemonअपने में init.d/nginx


मुझे क्रोनोलोग से प्यार है; इसका उपयोग / अनुशंसा करते हुए अधिक लोगों को देखना अच्छा है।
नाटाकाडो

1

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

लॉग किए गए अनुरोध में वर्ष और महीने का उपयोग करते हुए, लाइन को फिर एक फ़ाइल या पाइप पर लिखा जाता है जिसमें लॉग डेटा से गणना की गई YYYMM शामिल होती है। हां यह सामान्य लॉग प्रारूप के लिए कुछ विशिष्ट है। पहले [तारीख को सीमांकित करने के लिए माना जाता है। IPv6 पतों से सावधान रहें। :)

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

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

स्रोत कोड: http://stuge.se/datelog.c

कृपया मुझे कोई प्रतिक्रिया और पाठ्यक्रम पैच भेजने के लिए स्वतंत्र महसूस करें!


1

आप इसे एक साधारण बैश स्क्रिप्ट और क्रोन का उपयोग करके प्राप्त कर सकते हैं:

#!/bin/bash
DATE=$(date +%Y-%m-%d-%H%M)
mv /var/log/nginx/access.log /var/log/nginx/nginx.access.log.$DATE
mv /var/log/nginx/error.log /var/log/nginx/nginx_error.log.$DATE
kill -USR1 `cat /var/run/nginx.pid`
sleep 1
gzip /var/log/nginx/access.log.$DATE
gzip /var/log/nginx/error.log.$DATE

Crontab की स्थापना के बारे में अधिक जानकारी यहाँ मिली: क्रोन के माध्यम से Nginx लॉग फ़ाइलों को घुमाया


0

मुझे डर है कि मैं वास्तव में आपके प्रश्न को नहीं समझ पा रहा हूँ: चूँकि nginx किसी भी बिलिन लॉगट्रेशन का समर्थन नहीं करता है, आपको कुछ इस तरह से जाना होगा

mv access.log access.log.$(date "+%Y-%m%d")
kill -USR1 $(cat master.nginx.pid)

/etc/cron.daily में कहीं भी (आपको पूर्ण मार्गनिर्देशों के ऊपर दिए गए फ़ाइलनामों को अर्हता प्राप्त करने की आवश्यकता है) या apache2 उपयोगिताओं को स्थापित करने के लिए रोटेटलॉग्स का उपयोग करना होगा।


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