रूबी ऑन रेल्स प्रोडक्शन लॉग रोटेशन


172

रूबी प्रोडक्शन ऐप पर एक रूबी पर लॉग रोटेशन को सक्षम करने का सबसे अच्छा तरीका क्या है?

यह होस्टिंग सर्वर पर logrotate का उपयोग करके या अनुप्रयोग से लकड़हारा शुरू करते समय उपयोग करने के लिए विकल्पों का एक सेट है?


मैं देखता हूं कि इस पर पहले से ही एक उत्तर है, लेकिन मैं पूछना चाहता था कि आपका पर्यावरण क्या है। मैं खुद syslog + logrotate पद्धति का उपयोग करता हूं, लेकिन जाहिर है कि जिस तरह का वातावरण (चाहे समर्पित, साझा; किस तरह का * ix OS होस्ट कर रहा है, या कोई अन्य, आदि) यहां कुछ असर पड़ेगा।
येलुमिनेट करें

जवाबों:


203

विकल्प 1: syslog + logrotate

आप सिस्टम लॉग टूल का उपयोग करने के लिए रेल को कॉन्फ़िगर कर सकते हैं।

विन्यास / वातावरण / उत्पादन में एक उदाहरण ।

# Use a different logger for distributed setups
config.logger = SyslogLogger.new

इस तरह, आप syslog में लॉग इन करते हैं, और लॉग को घुमाने के लिए डिफ़ॉल्ट लॉगोटेट टूल का उपयोग कर सकते हैं।

विकल्प 2: सामान्य रेल लॉग + लॉगोटेट

एक अन्य विकल्प केवल लॉग लॉग को रेल द्वारा छोड़े गए लॉग को लेने के लिए कॉन्फ़िगर करना है। उबंटू और डेबियन पर, उदाहरण के लिए, नामक एक फ़ाइल में होगा /etc/logrotate.d/rails_example_com

/path/to/rails.example.com/tmp/log/*.log {
    weekly
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    copytruncate
}

नीचे दिए गए सुझावों के अनुसार, रेल में, सलाह दी जाती है copytruncateकि रेल एप्लिकेशन को पुनः आरंभ करने से बचें।

संपादित करें: हटाए गए "साझाकरण / एंडस्क्रिप्ट" चूंकि वे यहां उपयोग नहीं किए गए हैं और टिप्पणी के अनुसार समस्याएं पैदा करते हैं। और create 640 root admसुझाव के अनुसार हटा दिया गया।


3
लॉगोट्रोट का उपयोग करने के लिए, "config.logger = SyslogLogger.new" लाइन को विन्यास / वातावरण / उत्पादन में होना चाहिए। या तो टिप्पणी की जाती है, या इसे अनियंत्रित किया जाना चाहिए?
रॉबर्टव्रेडफोर्ड

2
यह टिप्पणी की जानी चाहिए, ताकि लॉग फाइलें (उदाहरण के लिए) में लिखी जाएं: /var/www/myrailsapp/current/log/production.log
Luca Spiller

3
यदि logrotateसमाधान का उपयोग किया जाता है, तो यह @ amit-saxena के जवाब के लायक है - निर्देश copytruncateपर उपयोग का सुझाव देता है create
टॉम हैरिसन

3
जब आप उपयोग करते हैं copytruncate, createतो कोई प्रभाव नहीं पड़ता है, इसलिए आपको संभवतः इसे अपने उदाहरण से हटा देना चाहिए
Michaël Witrant

3
आपको su your_rails_user your_rails_groupअपनी लॉग फ़ाइलों के स्वामी और समूह (यानी, उन रेल / यात्री प्रक्रिया के) या (हाल के संस्करणों के साथ) को जोड़ने की आवश्यकता हो सकती है, लॉगोटोट अनुमतियों के बारे में शिकायत कर सकते हैं।
.सिक्कर

56

यदि आप लोगरोट का उपयोग कर रहे हैं तो आप नीचे दिए गए विकल्पों में से किसी एक को /etc/logrotate.d/ निर्देशिका में एक गोपनीय फ़ाइल रखकर चुन सकते हैं।

# Rotate Rails application logs based on file size
# Rotate log if file greater than 20 MB
/path/to/your/rails/applicaton/log/*.log {
    size=20M
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    copytruncate
}

या

# Rotate Rails application logs weekly
/path/to/your/rails/applicaton/log/*.log {
  weekly
  missingok
  rotate 52
  compress
  delaycompress
  notifempty
  copytruncate
}

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


लेकिन क्या मुझे पुनः आरंभ नहीं करना चाहिए कि क्या हर बार लॉगोट्रेट चलता है?
लाजप

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

1
यदि आप कॉपीरूट का उपयोग कर रहे हैं तो आपको रेल को पुनः आरंभ करने की आवश्यकता नहीं है क्योंकि यह अभी भी उसी लॉग फ़ाइल की ओर इशारा करता है।
amit_saxena

क्या लॉग को घुमाने के लिए कॉन्फ़िगरेशन की आवश्यकता होती है? जैसे "साप्ताहिक" या "आकार = 20M"? या क्या आप इसे छोड़ सकते हैं, यदि आप केवल लॉगरेट को मैन्युअल रूप से चलाना चाहते हैं?
डेमनमैन

1
मुझे यकीन नहीं है कि अगर मैं आपके प्रश्न को सही ढंग से समझ गया हूं, लेकिन आपको ऑटो लॉग रोटेशन के लिए एक मानदंड निर्दिष्ट करने की आवश्यकता है। यदि आप नहीं चाहते कि यह स्वचालित हो, तो फ़ाइल को /etc/logrotate.d/ निर्देशिका में न रखें, इसे किसी अन्य स्थान पर रखें। आप logrotate --force $CONFIG_FILEइसे मैन्युअल रूप से चलाने के लिए config फ़ाइल स्थान निर्दिष्ट करके चला सकते हैं।
amit_saxena

31

रेल 5 के लिए, यह वही है जो मुझे लॉग साइज को सीमित करने के लिए करना था और कंसोल में सर्वर आउटपुट को नहीं बदलना चाहिए:

प्रलेखन के अनुसार , यदि आप लॉग फ़ोल्डर के आकार को सीमित करना चाहते हैं, तो इसे अपने पर्यावरण-फ़ाइल ('development.rb' / 'production.rb') में डालें।

config.logger = ActiveSupport::Logger.new(config.paths['log'].first, 1, 50 * 1024 * 1024)

इसके साथ, आपकी लॉग फाइलें कभी भी 50Mb से बड़ी नहीं होंगी। आप अपनी पसंद के अनुसार आकार बदल सकते हैं। दूसरे पैरामीटर में '1' का अर्थ है कि 1 ऐतिहासिक लॉग फ़ाइल रखी जाएगी, इसलिए आपके पास 100Mb लॉग तक - वर्तमान लॉग और 50Mb का पिछला हिस्सा होगा।

इस समाधान का स्रोत


2
पहला तर्क फ़ाइल नाम है, बस बोल रहा है, यानी 'लॉग / डेवलपमेंट।' इसलिए मैं लंबा, लेकिन पारदर्शी तरीका पसंद करूंगा। इसके बजाय config.paths['log'].firstमैं Rails.root.join('log', "#{Rails.env}.log")
डालूँगा

1
@ZiaUlRehmanMughal हाँ, यह रेल 4 के साथ काम कर रहा है। मैं रेल का उपयोग कर रहा हूँ 4.2.3, इस तरह से विन्यास के साथ: config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
ThienSuBS

1
इसे पढ़ने में आसान बनाने के लिए, यह ध्यान देने योग्य है कि आप ActiveSupport बाइट एक्सटेंशन पर भरोसा कर सकते हैं: 50.megabytesजैसा है 50 * 1024 * 1024, लेकिन समझने में बहुत आसान है। देखें ActiveSupport कोर एक्सटेंशन अधिक जानकारी के लिए।
पियरे-एड्रियन ब्यूसन

1
कुछ गोलगप्पे (प्रोग्रामर जीवन: डी) के बाद यहां फिर से मिला। मैं सोच रहा था कि क्या हम लॉग फ़ोल्डर में सभी लॉग फ़ाइलों को घुमाने के लिए इस लाइन को कॉन्फ़िगर कर सकते हैं? जाहिरा तौर पर यह लाइन केवल पहली पंक्ति को घुमाएगी।
ज़िया उल रहमान मुग़ल

ध्यान दें कि यह केवल आप के रूप में लॉग इन करने के घूर्णन करेगा / production.log फ़ाइल Rails.application.config.paths['log'].firstवापसी वास्तव में इस फाइल
valachi


2

प्रत्येक लॉग के लिए: रेल लॉग, Rpush लॉग ... ... आप अपनी सेवा की कॉन्फ़िगरेशन फ़ाइल में इस तरह का उपयोग कर सकते हैं:

 config.log_file = 'log/rpush.log'
 config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)

इसका मतलब है: विभाजन के बाद केवल 1 पिछली लॉग फ़ाइल को सहेजें। मुख्य लॉग आकार कभी भी 20 एमबी से अधिक नहीं होता है।


-9

मेरे वातावरण / उत्पादन में निम्नलिखित लॉग के रूप में लॉग का उपयोग करके लॉग भेजने में सक्षम करें। रेल संस्करण 4.1.0 है

RailsApplication::Application.configure do
require 'logglier'
config.logger = Logglier.new(<https://logs-01.loggly.com/inputs/inputkey>)
log.info("hello from logglier")
end

कृपया मुझे कुछ सुझाव दें कि क्या करना है ... यह कोड काम नहीं कर रहा है
riya khana

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