2015-02-08 32 views
10

मैंने एक PHP + MYSQL वेब ऐप बनाया है और मैं अब प्रत्येक उपयोगकर्ता के कुछ कार्यों को संग्रहीत करने और ट्रैक करने के लिए लॉगिंग सिस्टम को कार्यान्वित करने की कोशिश कर रहा हूं।डेटाबेस लॉग बनाम फ़ाइल लॉग

इसका उद्देश्य निम्न है: आईपी + टाइम + एक्शन लॉग करके प्रत्येक उपयोगकर्ता के सत्र की गतिविधि को ट्रैक करें, फिर देखें कि वह किस पेज को बाद में लॉगिंग समय + पेगेनेम द्वारा एक्सेस किया गया था; प्रत्येक उपयोगकर्ता के लिए प्रारूप में एक फ़ाइल होगी: लॉग {userid} _ {month} .log

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

वर्तमान में, मेरे पास एक MYSQL MyISAM तालिका है जहां मैं उपयोगकर्ता आईडी, आईपी, समय, क्रिया संग्रहीत करता हूं और ऐप अभी भी लॉन्च नहीं हुआ है, लेकिन हमारे पास बहुत सारे उपयोगकर्ता (100k से अधिक) हैं, और इसके लिए डेटाबेस का उपयोग करना चाहते हैं समाधान आत्महत्या की तरह लगता है।

तो आप क्या सुझाव देते हैं? लॉगिंग कैसे किया जाना चाहिए? एक अलग डेटाबेस का उपयोग कर, वर्तमान डेटाबेस में एक तालिका का उपयोग कर, फ़ाइलों का उपयोग कर? क्या PHP के लिए कोई फ़ाइल-लॉगिंग फ्रेमवर्क उपलब्ध है?

फ़ाइल को पढ़ने के बाद कैसे किया जाना चाहिए? पंक्ति से परिणाम पढ़ें?

धन्यवाद

+1

तुम सच में इस पर गौर करना चाहिए: https://github.com/Seldaek/monolog –

उत्तर

18

आप कई विकल्प हैं, इसलिए मैं 500k के बारे में उपयोगकर्ताओं, 100k सक्रिय हर महीने है, जो अपनी श्रेणी की हो रहा है के साथ एक स्टार्टअप चल मेरे अनुभव से बात करेंगे।

हमने उपयोगकर्ता कार्यों को एक MySQL डेटाबेस में लॉग किया है।

  1. अपने डेटा का पता कर बहुत आसान और तेजी से (अच्छा अनुक्रमित प्रदान की गई)
  2. हम Azure पर भाग गया, और एक समर्पित MySQL था (दास के साथ, आदि) लॉग सहित सभी उपयोगकर्ता डेटा संग्रहीत करने के लिए है। अंतरिक्ष एक मुद्दा नहीं था।
  3. MySQL पर लॉग इन करना आपके द्वारा लॉग इन किए जा रहे सब कुछ के आधार पर धीमा हो सकता है, इसलिए हमने Redis पर लॉग को धक्का दिया और पाइथन ऐप को रेडिस से पढ़ा और पृष्ठभूमि में MySQL में डाला। इसने लॉगिंग को मूल रूप से लोड होने के समय पर कोई प्रभाव नहीं पड़ा।

    1. हम बहुत प्रयास के बिना किसी भी समय कुछ भी पर प्रश्नों को चलाने के लिए चाहता था:

    हम उपयोगकर्ता कार्यों के लिए MySQL में लॉग इन करने की वजह से फैसला किया। उपयोगकर्ता एक्शन लॉग के संरचित प्रारूप ने अविश्वसनीय रूप से करना आसान बना दिया।

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

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

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

उन्नत का उपयोग करता है

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

समापन

मेरे सुझाव से अधिक अब के लिए यह सोच भी नहीं होगा, MySQL, क्वेरी के लिए लॉग इन करें और आँकड़े देखें। अद्यतन करें, कुल्ला और दोहराना। आप चक्र को तैनाती और त्वरित अद्यतन के बीच रखना चाहते हैं, इसलिए त्वरित SQL क्वेरी से निर्णय लेने से यह आसान हो जाता है।

असल में जो आप टालना चाहते हैं वह एक सर्वर में लॉगिंग कर रहा है, लॉग ढूंढ रहा है और grep कुछ खोजने के लिए इसके माध्यम से अपना रास्ता है, उपरोक्त प्राप्त किया गया है।

यह हम क्या किया है, यह अभी भी ऐसे ही चल रहा है और हम इसे जल्द ही बदलने के लिए कोई योजना नहीं है। हमारे पास कोई समस्या नहीं है जहां हमें कुछ भी नहीं मिला जो हमें चाहिए। यदि उपयोगकर्ताओं का भारी विस्फोट होता है और हम 1 मिलियन मासिक सक्रिय उपयोगकर्ताओं तक पहुंचते हैं, तो हम बदल सकते हैं।

कृपया ध्यान दें: जो भी जिस तरह से आप लॉग इन करने, अगर आप पोस्ट डेटा की बचत कर रहे निर्णय लेते हैं, यह सुनिश्चित हो कि क्रेडिट कार्ड की जानकारी के लिए, जब तक आप शिकायत कर रहे हैं ऐसा कभी नहीं करने के लिए। या इसके बजाय Stripe के जावास्क्रिप्ट पुस्तकालयों का उपयोग करें।

+0

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

+1

इस स्टार्टअप के बाद से यह दो साल हो गया है, निम्नलिखित स्मृति से है। हमारे पास एक सारणी थी जो अनिवार्य रूप से प्रत्येक कॉल को लॉग इन करती थी, इसमें 'नियंत्रक', 'क्रिया', 'param', अनुरोध में आईडी), 'user_agent',' query_string', 'user_id' (अगर लॉग इन है, और' अतिथि '), 'आईपी', 'टाइमस्टैम्प'। हमारा लक्ष्य जेनेरिक एप्लिकेशन लॉग, लेकिन उपयोगकर्ता क्रियाओं को सहेजना नहीं था। लॉगिंग जो पर्याप्त था जो किया था। अगर हम उन सभी को देखना चाहते थे जिन्होंने प्रोजेक्ट 156 का दौरा किया, तो सरल 'चयन * user_action_logs से जहां नियंत्रक =' प्रोजेक्ट 'और एक्शन =' व्यू 'और param = 156' ने हमें दिया। आपका उपयोग मामला अलग हो सकता है। –

2

आप यह सुनिश्चित करें कि लॉग पढ़ने मुख्य रूप से एक समय में एक उपयोगकर्ता को लक्षित कर रहे हैं, तो आप अपने लॉग तालिका partioning विचार करना चाहिए: http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html विभाजन कुंजी के रूप में अपने user_id का उपयोग कर।

विभाजन 1024 जा रहा है की अधिकतम संख्या है, तो आप एक विभाजन अपने 100k उन है, जो कुछ उचित है की 1/1000 भंडारण होगा।

2

क्या PHP के लिए कोई फ़ाइल-लॉगिंग ढांचा उपलब्ध है?

इस जो packagist पर उपलब्ध है: https://packagist.org/packages/psr/log

ध्यान दें कि यह एक फ़ाइल लॉगिंग ढांचे लेकिन छवि से PSR-3 मानक के आधार पर एक लकड़हारा के लिए एक API नहीं है। तो, यदि आप चाहें, तो यह PHP के लिए "मानक" लॉगर इंटरफ़ेस है। आप एक लॉगर बना सकते हैं जो इस इंटरफ़ेस को लागू करता है या उस इंटरफ़ेस को लागू करने वाले अन्य लॉगर्स के लिए पैकगिस्ट पर चारों ओर खोज करता है (या तो फ़ाइल या MySQL आधारित)। पैकेजिस्ट (सिखाए, वानिकी) पर कुछ अन्य लॉगर्स हैं, लेकिन पीएसआर मानक में चिपकने वाले एक का उपयोग करना बेहतर होगा।

+2

यहाँ दो PSR-3 अनुरूप लॉग संकुल हैं: https://packagist.org/packages/monolog/monolog https://packagist.org/packages/gplanchat/php-log – delatbabel

1

हम महान उपकरण Graylog साथ प्रवेश करने देते।

यह रूप में उच्च पैमाने के रूप में आप यह चाहते हैं, तो डेटा दृश्य पर शानदार टूल हैं, अविश्वसनीय रूप से भी जटिल querys और विशाल डेटासेट के लिए तेजी से होता है, और अंतर्निहित खोज-enginge (elasticsearch) स्कीमा-है।उत्तरार्द्ध एक लाभ हो सकता है क्योंकि परेशानी के बिना आपके लॉग को विस्तारित करने के लिए आपको अधिक संभावनाएं मिलती हैं mysql-schemas आपको दे सकता है।

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

वास्तव में ग्रेग्लॉग पर लॉग इन करना पहले से ही निर्दिष्ट php-lib monolog के साथ आसान है।

यहां पर बड़ी हानि का अभिशाप यह है कि आपको नए टूल्स और सॉफ्टवेयर का एक गुच्छा सीखना है। लेकिन यह मेरी राय में लायक है।

0

SysLog का उपयोग करें;) इसे किसी अन्य सर्वर पर सेट करें और यह आपकी सभी प्रक्रियाओं को अलग-अलग लॉग कर सकता है (जैसे नेटवर्किंग, सर्वर, एसक्यूएल, अपाचे और आपके PHP)। यह आपके लिए उपयोगी हो सकता है और डीबगिंग के समय व्यय को कम कर सकता है। :)

1

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

  • MySQL with a blackhole स्टोरेज इंजन। इसे सही और इसके तेजस्वी तेजी से सेट करें!
  • Riak Cluster (नोएसक्यूएल समाधान) - हालांकि यह आपके लिए एक सीखने की अवस्था हो सकती है, यह शायद एक हो सकता है जिसे आपको अंततः लेना पड़ सकता है।
+0

नहीं बिल्कुल नहीं .. यदि आप लिंक पढ़ते हैं तो यह अधिक विस्तार से समझाएगा। यह चित्र विशेष रूप से आसान है (https://dev.mysql.com/doc/refman/5.0/en/images/blackhole-1.png)। क्या होता है कि बयान एक लॉग में लिखा जाता है जो किसी डेटाबेस को नहीं होता है। आप एक अलग MySQL उदाहरण का उपयोग करने के साथ-साथ उन बयान को अपने स्वयं के सुखद समय में डेटाबेस में खींचते हैं। इसका मतलब है कि लेखन तेजी से होता है और भंडारण स्वतंत्र रूप से होता है (असीमित रूप से)। – diversemix

+0

धन्यवाद, उस दृष्टिकोण के बारे में कभी नहीं सुना। –

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