उत्पादन में उपयोगकर्ता कार्यों को लॉग करने के लिए सर्वोत्तम अभ्यास


22

मैं अपने उत्पादन वातावरण में बहुत सारे सामानों को लॉग इन करने की योजना बना रहा था, जब उपयोगकर्ता

  • लॉग इन, लॉग ऑफ
  • विवरणिका बदले
  • खाता सेटिंग संपादित करें
  • पासवर्ड बदलें ... आदि

क्या यह उत्पादन संवर्धन पर एक अच्छा अभ्यास है? साथ ही यह सब लॉग करने का एक अच्छा तरीका क्या है। मैं वर्तमान में लॉग इन करने के लिए निम्नलिखित कोड ब्लॉक का उपयोग कर रहा हूं:

public void LogMessageToFile(string msg)
        {

            System.IO.StreamWriter sw = System.IO.File.AppendText(
                GetTempPath() + @"MyLogFile.txt");
            try
            {
                string logLine = System.String.Format(
                    "{0:G}: {1}.", System.DateTime.Now, msg);
                sw.WriteLine(logLine);
            }
            finally
            {
                sw.Close();
            }
        }

क्या यह उत्पादन के लिए ठीक होगा? मेरा एप्लिकेशन बहुत नया है इसलिए लाखों उपयोगकर्ताओं को तुरंत या किसी भी चीज़ की उम्मीद नहीं है, किसी वेबसाइट पर कार्रवाइयों पर नज़र रखने के लिए सर्वोत्तम प्रथाओं की तलाश में है या यदि इसके लिए भी सर्वोत्तम अभ्यास है।


1
मैं शायद Databaseएक पाठ फ़ाइल पर सुझाव

@ डेजिक: लॉगिंग के उद्देश्य पर निर्भर करता है। यदि त्रुटि ट्रैकिंग / ट्रेसिंग उस उद्देश्य का कोई हिस्सा है, तो डेटाबेस बाहर है। प्रोग्रामर
।stackexchange.com

मैंने इसका एक बुनियादी कार्यान्वयन किया a User Activity Logger that hooks up various events, आप इसे यहाँ देख सकते हैं: stackoverflow.com/questions/30326673/… । का आनंद लें!
जेरेमी थॉम्पसन

जवाबों:


30

यह सवाल का सीधा जवाब नहीं है, इस पर अधिक विस्तार है।

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

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

रिकॉर्डिंग के बिना हमने ऐसा करने के लिए कभी नहीं सोचा होगा।


1
आप अकेले इस टिप्पणी पर केंद्रित पुस्तक लिख सकते हैं!
बिशप

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

9

अगर मैं तुम हो और मैं एक पाठ फ़ाइल लिखने के साथ चिपका रहा था, तो मैं log4net का उपयोग करूँगा और एक विशिष्ट "UserActions.log" फ़ाइल में लॉग इन करूँगा। इस तरह से यह आपके सामान्य लॉगिंग को खत्म नहीं करता है। Log4net (या किसी भी अन्य लॉगिंग फ्रेमवर्क) का उपयोग करके आप पहिया को फिर से आविष्कार करने और रोलिंग फ़ाइल एपेंडर्स, चेतावनी / त्रुटि / डिबग / सूचना कोड, बैच फ़ाइल लेखन आदि से बच सकते हैं। यह हमेशा अच्छा लॉगिंग में निर्माण करने के लिए एक अच्छा विचार है। किसी भी उत्पादन स्तर के आवेदन।

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


3
आप अपना केक ले सकते हैं और खा सकते हैं: log4net के लिए एक डेटाबेसएपेंडर है: logging.apache.org/log4net/release/config-examples.html । लेकिन यदि आप प्रदर्शन के बारे में चिंतित हैं, तो आप फ़ाइलों को लॉग इन भी कर सकते हैं और उन्हें एक अलग सेवाओं में पार्स कर सकते हैं, जो तेज़ रिपोर्टिंग (जो एक रिपोर्ट डेटाबेस हो सकता है) के लिए डेटा को प्रीपोज़ कर रहा है।
निराशा के मुंह बनाना

9

लॉग फ़ाइल का उपयोग किया जाता है 1. डिबगिंग सिस्टम त्रुटियों के लिए जानकारी प्राप्त करने के लिए। 2. शरारत के लिए उपयोगकर्ता गतिविधि पर शोध करना, या 3. यह समझने के लिए कि लोग सिस्टम का उपयोग कैसे करते हैं जब आप उन्हें देखने नहीं जा सकते। ये ध्यान रखते हुए:

  • अनुप्रयोग स्टार्टअप पर लॉग पर्यावरण (जैसे पर्यावरण संस्करण, अन्य सेटिंग्स, आदि)। यह डिबगिंग समस्याओं के लिए सहायक है।
  • प्रत्येक अनुरोध के लिए उपयोगकर्ता और कार्रवाई (URL का अलग हिस्सा) को लॉग इन करें।
  • प्रत्येक अनुरोध के लिए सभी मापदंडों के लिए लॉग इन छोड़कर पासवर्ड के लिए। मैं जैसे लॉग में प्रत्येक पैरामीटर के आसपास delimiters डाल पसंद है phone{(999)999-9999} email{aaa@aaa.com}। पासवर्ड को कभी भी डेटाबेस के अलावा एक तरह से कहीं भी नहीं लिखा जाना चाहिए , प्रत्येक उपयोगकर्ता के लिए अद्वितीय नमक के साथ क्रिप्टोग्राफिक रूप से सुरक्षित हैश फ़ंक्शन और हैशिंग के कई राउंड (फ़ुटनोट देखें)
  • लॉग इन करते समय, आपको उपयोगकर्ता का आईपी पता, उपयोगकर्ता आईडी, नाम, असफल लॉगिन की गिनती, शायद ब्राउज़र, शायद कुकी सत्र आईडी, लेकिन पासवर्ड कभी नहीं लॉग करना चाहिए।
  • लॉगिन पेज और चेंज-पासवर्ड पेज पर पासवर्ड लॉग न करना याद रखें , और न ही गुप्त प्रश्न या उत्तर को लॉग करना चाहिए यदि आपके पास यह कार्यक्षमता है। किसी भी अन्य पासवर्ड या एन्क्रिप्शन कुंजी को लॉग इन नहीं करना चाहिए। इन मापदंडों के लिए लॉग में छह सितारों की तरह कुछ लिखने के लिए यह एक अच्छा अभ्यास है ताकि आप देख सकें कि आपको इस डेटा को दबाने के लिए याद किया गया था।
  • मुझे प्रत्येक अनुरोध को पूरा करने में लगने वाले कुल समय में प्रवेश करना पसंद है: Done: 49ms
  • मुझे सत्र स्थिति में परिवर्तन लॉग करना पसंद है। ये दुर्लभ होना चाहिए।
  • जैसा कि अन्य लोगों ने कहा, फ़ाइलों को लॉग करने के लिए महान लॉगिंग लाइब्रेरी हैं, डेटाबेस लॉगिंग के बारे में निश्चित नहीं है।
  • स्टोर लॉग सुरक्षित रूप से। पासवर्ड के बिना भी, व्यक्तिगत रूप से पहचान योग्य जानकारी ( सुरक्षित हार्बर देखें ) के बारे में राज्य, संघीय और अंतर्राष्ट्रीय कानून हैं, लॉग डेटा को गोपनीय बनाते हैं।
  • बैकअप लें। यदि आप उन्हें हर रात एक पूर्ण-ड्राइव बैकअप में प्रवाहित करते हैं, तो सुनिश्चित करें कि नए सर्वर पर अपग्रेड करने से पहले उन्हें वापस कहीं और याद रखना सुनिश्चित करें (मुझसे यह न पूछें कि मैंने यह कैसे सीखा)।

अन्य टिप्स

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


2

आप निर्दिष्ट नहीं करते हैं कि आप डेटाबेस का उपयोग कर रहे हैं, लेकिन यदि आप हैं और वह डेटाबेस SQL ​​सर्वर है, तो आप AutoAudit नामक कुछ जोड़ सकते हैं और अपने डेटा के साथ सभी इंटरैक्शन को स्वचालित रूप से लॉग इन कर सकते हैं । केवल उन वस्तुओं को निर्दिष्ट करना सुनिश्चित करें जिन्हें आप ऑडिट करना चाहते हैं।

लेकिन वैसे भी, मैं अपने ट्रैकिंग को मैन्युअल रूप से कोड करने की कोशिश नहीं करूंगा क्योंकि यह एक रखरखाव दुःस्वप्न को समाप्त करेगा।

इसके अलावा, लॉगिंग के लिए, अपना स्वयं का रोल न करें, एंटरप्राइज़ लाइब्रेरी लॉगिंग या लॉग 4नेट या इसी तरह का उपयोग करें।


2

बस एक सामान्य सलाह है। सीधे तौर पर आपके सवाल से संबंधित नहीं हो सकता।

यह इस बात पर निर्भर करता है कि आप लॉग के लिए क्या उपयोग करने जा रहे हैं? ज्यादातर लॉग का उपयोग उत्पादन में त्रुटियों का कारण बनने वाले संचालन का पता लगाने के लिए किया जाता है। यदि आप उन्हें उपयोगकर्ता कार्यों पर नज़र रखने के लिए रख रहे हैं, तो यह लॉग का हिस्सा नहीं है। यह उत्पाद का सर्वर साइड फीचर होना चाहिए। बाद में अध्ययन के लिए इन चीजों को निश्चित रूप से डेटाबेस में जाने की आवश्यकता है। लेकिन सर्वर साइड लॉग होता है, जैसे "कुछ टेक्स्ट खाली होने पर एरर हुआ", फीचर का हिस्सा नहीं है। इन चीजों को फाइल सिस्टम में जाने की जरूरत है। उनके साथ निम्नलिखित सामग्री होनी चाहिए: - user_id, error_number, error_text, file_name, function_name, thread_id, system_date_time, और अन्य कोई संदर्भ।

अब मैं केवल फाइलों में लॉग के बारे में बात कर रहा हूं।

1) उन्हें अतुल्यकालिक रखें। I / O ऑपरेशन महंगा है।

2) उन्हें फंक्शन की तुलना में क्लास के रूप में डिजाइन करें। भविष्य में बदलाव आसान होंगे।

3) यदि संभव हो तो उन्हें सिंगलटन रखें। मल्टी-थ्रेडेड में सिंगलटन मुश्किल है, इसलिए ठीक से डिज़ाइन करें।

4) लकड़हारा और लोगगी के बीच बातचीत को सरल रखना भी बेहतर है। अधिकांश समय वास्तविक message_text की तुलना में message_number भेजते हैं, और लकड़हारे को नंबर से संदेश प्राप्त करने देते हैं। यह मदद करेगा अगर बाद में हम जेनेरिक लॉग फॉर्मेट में बदलाव करना चाहते हैं।

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


1

Log4Net की कोशिश करें। यह आपको फ़ाइलों या डेटाबेस में लॉग इन करने की अनुमति देता है। यहाँ ट्यूटोरियल है !

हम अपने सभी प्रोजेक्ट्स में Log4Net का उपयोग करते हैं।


0

लॉग फ़ाइल का उपयोग मुद्दों की एक जोड़ी प्रस्तुत करता है। जब कई प्रक्रियाएँ फ़ाइल तक पहुँचने का प्रयास करती हैं, तो सबसे पहले आपको त्रुटियाँ मिल सकती हैं। जब आपका सिस्टम चल रहा हो, तो फ़ाइल को साइकल या क्लियर करने की कोशिश करने पर आपको समस्याएँ हो सकती हैं। जिस तरह से चारों ओर एक डेटाबेस का उपयोग करने के लिए है।

तो, चरण 1 एक डेटाबेस तालिका बनाने के लिए है। मैं निम्नलिखित क्षेत्रों का सुझाव देता हूं:
* userID
* क्रिया (जैसे लोगन, मिटाना foo)
* कुछ वर्णनात्मक पाठ (यहाँ नल की अनुमति दें)
* टाइमस्टैम्प

चरण 2, यूजरआईडी, कार्रवाई और वर्णनात्मक पाठ के लिए इनपुट के साथ एक संग्रहीत प्रक्रिया बनाएं। समय टिकट बनाने के लिए बस वर्तमान समय का उपयोग करें।

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

चरण 4, समय-समय पर लॉगिंग टेबल से पुराने संदेशों को हटाने के लिए एक रखरखाव दिनचर्या बनाएं। शायद जब X से अधिक पुराना हो, तो प्रत्येक सप्ताह या नियमित DB रखरखाव (सूचकांक पुनर्निर्माण, आदि) के भाग के रूप में हटाएं।

एक बार जब आप इसे एक बार बना लेते हैं, तो आपको अन्य परियोजनाओं में शामिल कोड का उपयोग करने में सक्षम होना चाहिए।

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