2009-07-21 19 views
60

मुझे लॉग फ़ाइल के बजाय या इसके अलावा किसी भी डेटाबेस (MySQL या MongoDB) में सभी रेल एप्लिकेशन लॉगिंग भेजने में दिलचस्पी है। कुछ कारण हैं, जिनमें से अधिकांश लॉग फ़ाइल विश्लेषण के बारे में चिंतित हैं। हम पहले से ही Google Analytics का उपयोग करते हैं, लेकिन ऐसी कई चीजें हैं जिन्हें हम करना चाहते हैं जो Analytics में व्यावहारिक नहीं हैं।लॉग फ़ाइलों के बजाय डेटाबेस पर लॉग इन करें

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

अंत में, मैं अक्सर साइट विज़िटर व्यवहार के करीब कुछ जांचना चाहता हूं: उदाहरण के लिए साइट के माध्यम से पथ का पता लगाना, ताकि मैं देख सकूं कि अंतिम पृष्ठ क्या था जो उपयोगकर्ता किसी त्रुटि से पहले देख रहा था। देखते हुए हमारे पास एकाधिक ऐप सर्वर हैं, अलग-अलग लॉग फाइलें इसे वास्तविक दर्द बनाती हैं। यदि सभी डेटा डेटाबेस में थे, तो मैं किसी दिए गए विज़िटर के लिए आसानी से पृष्ठों का उचित अनुक्रम देख सकता था। मुझे पता है कि Syslog इस विशेष चीज़ (एकल लॉग फ़ाइल/भंडार) को हल करने का एक तरीका होगा, लेकिन मैं इसे बेहतर खोज क्षमताओं के साथ जोड़ना चाहता हूं जो मैं डेटाबेस खोजों से जोड़ता हूं।

मुझे आश्चर्य है कि लोग इसे हल करने के लिए क्या सलाह देते हैं। क्या आप सीधे डेटाबेस पर लॉग ऑन करते हैं, या आप लॉग फ़ाइलों को डीबी में डंप करते हैं (लेकिन इसके लिए आपका दृष्टिकोण क्या है ताकि यह अनिवार्य रूप से रीयलटाइम/लॉगफाइल के रूप में अद्यतित हो)?

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

वैसे भी, मैं एक सही उत्तर की तलाश नहीं कर रहा हूं, इस बारे में अधिक चर्चा और जानकारी जो इस और प्रकाश में किसी और के साथ कर सकती है।

+0

बस उत्सुक, रेल एप्लिकेशन लॉगिंग के बारे में इतना खास क्या है? क्या यह वेब एक्सेस लॉग पंजीकरण अनुरोधों की तरह कुछ है? या क्या यह वास्तविक अनुप्रयोग तर्क है जिसका मतलब है? – Dima

+0

नीचे दी गई टिप्पणियां देखें: मुझे ऐप लेवल लॉगिंग में अधिक दिलचस्पी है, लेकिन यह पूरी तरह से जरूरी नहीं है, फिर भी मैं वेब सर्वर द्वारा दी गई स्थिर फाइलों (छवियों, सीएसएस, आदि) को लॉग नहीं करना चाहता हूं। हम अपवाद लॉगिंग/अधिसूचना के लिए हॉपटोड का उपयोग करते हैं, जो एक अच्छा समाधान है। मेरा प्रश्न वास्तव में एक अनुरोध/सर्वेक्षण है जो किसी और ने लागू किया है जो इस या इसी तरह की आवश्यकता को हल करता है। – chrisrbailey

+1

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

उत्तर

8

आप डिफ़ॉल्ट लॉगिंग व्यवहार बदलना चाहते हैं, बस एक कस्टम लकड़हारा उद्देश्य यह है कि सभी रेल लकड़हारा विधि का जवाब बनाने के लिए:

  • जोड़ने
  • डिबग, चेतावनी दी है, त्रुटि, जानकारी, घातक, अज्ञात

http://github.com/rails/rails/blob/9d7aae710384fb5f04129c35b86c5ea5fb9d83a9/activesupport/lib/active_support/buffered_logger.rb

क्योंकि यह अपने लकड़हारा है, तो आप तय कर सकते हैं अपने व्यक्तिगत तर्क को लागू करें। जब भी आप चाहें मानक आउटपुट में डेटाबेस को लिख सकते हैं।

फिर, प्रत्येक बेस क्लास के लिए डिफ़ॉल्ट लॉगर को प्रतिस्थापित करें जिसे आप कस्टमाइज़ करना चाहते हैं।

ActiveRecord::Base.logger = YouLogger.new 

आप आसानी से logger.rb नामक प्रारंभकर्ता फ़ाइल बना सकते हैं और अपनी सभी कस्टम कॉन्फ़िगरेशन लिख सकते हैं। इस तरह, लॉगर तुरंत रेल स्टार्टअप पर बदल दिया जाएगा।

+1

धन्यवाद। मुझे उल्लेख करना चाहिए था कि मैं उस विकल्प से अवगत था, लेकिन दूसरों के लिए भी अच्छे नोट्स। अधिकतर मैं उत्सुक हूं कि कोई और यह कैसे कर रहा है, उन्होंने क्या विकल्प बनाए हैं और इसी तरह। उदाहरण के लिए, यदि आप इसे इस तरह करते हैं, तो गति/प्रदर्शन के साथ क्या मुद्दे हैं - आप एक डीबी कनेक्शन कैसे रखते हैं और इसी तरह (यदि आप भी हैं), या क्या नहीं। – chrisrbailey

+0

ठीक वही है जो मैं खोज रहा था, 'ActiveRecord :: Base.logger' के अलावा प्रतिस्थापित करने के लिए अन्य लॉगर्स क्या हैं (मैं डेटाबेस के लिए सक्रिय रिकॉर्ड के बजाय मोंगोइड का उपयोग कर रहा हूं)? – Julien

+0

यदि यह किसी की मदद कर सकता है, तो रेल 4 में मुझे केवल प्रारंभिक में 'Rails.logger' को प्रतिस्थापित करना था। – Julien

3

मेरी साइट उत्पादन मोड में होने पर मेरी डेटाबेस में सभी समस्याओं को लॉग इन करने के लिए रेल "exception logger" का उपयोग करती है। यह आपको एक अच्छा इंटरफेस देगा जहां आप समस्याओं की जांच कर सकते हैं।आप को देखने के लिए क्या आपके आगंतुकों को वास्तविक समय में कर रहे हैं चाहते हैं तो,

+0

हम पहले से ही अपवाद लॉगिंग के लिए हॉपटोड का उपयोग करते हैं, जो मुझे अपवाद लॉगर या अपवाद नोटिफ़ायर प्लगइन्स से काफी बेहतर लगता है। यह उस समस्या के करीब कहीं भी नहीं मिलता है जिसे मैं संबोधित करने की कोशिश कर रहा हूं। जैसा कि मेरे प्रश्न में बताया गया है, मैं सिर्फ त्रुटियों की तुलना में लॉग में और अधिक खोज रहा हूं, मैं कुछ विश्लेषिकी चीजें करना चाहता हूं, पृष्ठों के माध्यम से उपयोगकर्ता के प्रवाह की जांच करना चाहता हूं। मैंने वूप्ररा को देखा, लेकिन जैसा कि मुझे याद है, हम साइट पर यातायात की मात्रा पर पहले से ही अपनी सीमा से अधिक हैं। – chrisrbailey

+0

वूप्ररा मुझे सबसे अच्छा मिला है। मेरा मानना ​​है कि वे जल्द ही बीटा से बाहर होंगे, और इसलिए मुझे लगता है कि उनकी यातायात सीमा बढ़ जाएगी। हालांकि वे अब भी मुक्त नहीं हो सकते हैं। हालांकि, अद्भुत सेवा। – Ian

1

क्रिस पर एक नज़र डालें

मुझे लगता है कि मेरे की टिप्पणी यहाँ महत्वपूर्ण है। क्या आप (1) डीबी (वास्तविक समय में) में एक्सेस लॉग होने से संतुष्ट हैं, या (2) क्या आप रेल/ऐप-विशिष्ट लॉगिंग में अधिक रूचि रखते हैं?

अपाचे (कम से कम) के साथ, (1) के लिए, आप पाइप लॉगिंग का उपयोग कर डेटाबेस में लॉग इन कर सकते हैं।

http://httpd.apache.org/docs/1.3/logs.html#piped

मैं एक प्रोग्राम है जो एक Postgres DB के लिए इनपुट है, जो यह पार्स करता है और लॉग के लिए इंतज़ार कर पृष्ठभूमि में चलता है लिखा था। एक कस्टमलॉग निर्देश के साथ इस httpd.conf फ़ाइल पाइप इस कार्यक्रम में।

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

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

यह वास्तव में नीचे आता है कि आपको रेल-विशिष्ट समाधान या अधिक सामान्य वेब-सर्वर-व्यापी समाधान की आवश्यकता है या नहीं।

+0

हम अपाचे का उपयोग नहीं करते हैं (Nginx का उपयोग करें), लेकिन यह एक अच्छा बिंदु है। मैं रेल लॉग के करीब कुछ के बाद हूं, उसमें मैं आवेदन स्तर लॉगिंग चाहता हूं, वेब सर्वर लॉग नहीं। मुझे छवियों और सीएसएस, आदि के सभी अनुरोधों की परवाह नहीं है, और इसके बजाय मुझे यूआरएल के बजाय ऐप-विशिष्ट लॉगिंग करना होगा। इसका वास्तव में तात्पर्य है कि मुझे रेल स्तर पर लॉगिंग करने की आवश्यकता है (यहां तक ​​कि रैक स्तर पर भी यह अभी भी यूआरएल है, हालांकि यह नेगिनक्स द्वारा की जाने वाली स्थैतिक संपत्तियों को हटा दिया जाएगा), लेकिन गति और ऐसे के लिए, मुझे आवश्यकता हो सकती है इसे रैक स्तर पर करने के लिए। – chrisrbailey

39

मेरी कंपनी कुछ संरचित यातायात जानकारी सीधे एक MySQL लॉग डेटाबेस में लॉगिंग कर रही है। यह डेटाबेस डाउनस्ट्रीम को दूसरे डेटाबेस में दोहराया गया है। सभी विश्लेषिकी अंतिम डेटाबेस प्रतिकृति को चलाते हैं। हमारी साइट काफी ट्रैफिक बनाए रखती है। अब तक, ऐसा कोई बड़ी समस्या नहीं प्रतीत होता है। हालांकि, हमारे आईटी विभाग में वर्तमान सेटअप की स्केलेबिलिटी के संबंध में कुछ बढ़ती चिंताएं हैं और यह सुझाव दे रहा है कि हम लॉग जानकारी को "उचित" लॉग-फाइलों पर ऑफ़लोड करते हैं। फिर लॉग-फाइल्स को उसी डाउनस्ट्रीम डेटाबेस टेबल में फिर से डाला जाएगा। जो मुझे इस सवाल पर लाता है। :)

यहाँ पक्ष-विपक्ष कि मैं लॉग-फ़ाइलों बनाम लॉग-डीबी (संबंधपरक) के विषय के लिए के बारे में देखते हैं में से कुछ हैं:

  • लॉग-फ़ाइलें, तेजी से विश्वसनीय, और स्केलेबल हैं (पर कम से कम मैंने सुना है कि याहू! उनके क्लिक ट्रैकिंग एनालिटिक्स के लिए लॉग फ़ाइलों का भारी उपयोग करता है)।
  • लॉग-फाइल sys-admin को बनाए रखने के लिए आसान है।
  • लॉग-फाइल बहुत लचीली हो सकती है क्योंकि आप इसे लगभग कुछ भी लिख सकते हैं।
  • लॉग-फाइलों के लिए भारी पार्सिंग और संभावित रूप से डेटा-निष्कर्षण के लिए मानचित्र-कम प्रकार के सेटअप की आवश्यकता होती है।
  • लॉग-डीबी संरचनाएं आपके आवेदन के बहुत करीब हैं, जिससे कुछ फीचर की बारी बहुत कम हो जाती है। यह एक आशीर्वाद या अभिशाप हो सकता है। शायद लंबे समय तक एक अभिशाप क्योंकि आप अधिकतर एक अत्यधिक युग्मित अनुप्रयोग और विश्लेषणात्मक कोड आधार के साथ समाप्त हो जाएंगे।
  • लॉग-डीबी लॉगिंग शोर और अनावश्यकता को कम कर सकता है क्योंकि लॉग-फाइल केवल तभी डाली जाती है जब लॉग-डीबी आपको अपडेट करने और संबंधित डालने की क्षमता देता है (यदि आप की हिम्मत हो तो सामान्यीकरण)।यदि आप डेटाबेस विभाजन और/या बहु लॉग डेटाबेस के साथ जाना (नीचे की ओर अनुकरण के माध्यम से डेटा पुन: शामिल)
  • लॉग-db बहुत तेजी से और स्केलेबल हो सकता है

मुझे लगता है कि लॉग डेटाबेस पर कुछ तनाव परीक्षणों में की जरूरत है मेरी स्थिति। इस तरह से कम से कम मुझे पता है कि मेरे पास कितना हेडरूम है।

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

लंबे समय तक, मुझे विश्वास है कि एक मजबूत एनालिटिक्स डेटा वेयरहाउस होना महत्वपूर्ण है। विश्लेषणात्मक डेटा से अनुप्रयोग डेटा को मुक्त करना और इसके विपरीत एक बड़ी जीत हो सकती है।


अन्त में, मैं सिर्फ बाहर बात करने के लिए वहाँ कई समान/निकट से संबंधित प्रश्न अपनी चर्चा को विस्तृत करना मामले में StackOverflow पर यहाँ हैं चाहते हैं।


संपादित करें:

rsyslog बहुत दिलचस्प लग रहा है। यह आपको सीधे MySQL पर लिखने की क्षमता देता है। यदि आप रूबी का उपयोग कर रहे हैं, तो आपको लॉगिंग मणि पर एक नज़र रखना चाहिए। यह बहु-लक्ष्य लॉगिंग क्षमताओं को प्रदान करता है। यह वास्तव में अच्छा है।

+0

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

1

के रूप में कोई जवाब नहीं अब तक स्वीकार कर लिया गया, मैं अपने योगदान दे देंगे

मैं rsyslog + से फाइल में नहीं बल्कि MongoDB

पूरे स्रोत कोड को लॉग को बचाने के लिए, rsylog करने के लिए एक प्लगइन का विकास किया प्लगइन यहां https://github.com/vpereira/rsyslogd-mongo

संकलित करने के लिए, आपको बस ./configure --help चलाएं और उपलब्ध विकल्पों को देखना चाहिए।

1

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

और विशेष रूप से रेल के संदर्भ में, जहां वास्तव में उपयोगी पुस्तकालयों जैसे एएएसएम लेनदेन में सामान का एक पूरा समूह लपेट लेगा, आप उन स्थानों पर लेन-देन के साथ समाप्त हो सकते हैं जिन्हें आपने नहीं सोचा था, जो समस्या भी बनाता है डीबग करने के लिए बहुत मुश्किल है।

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

संबंधित मुद्दे