डॉक में कई लॉग स्ट्रीम कैसे करें


21

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

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

हम सोच रहे हैं कि क्या कोई उपकरण या सिफारिशें हैं कि हमें इस स्थिति से कैसे संपर्क करना चाहिए।


4
मुझे नहीं लगता कि यह इसके लायक है। केवल "कुछ सिद्धांत" के कारण लॉग स्ट्रीम को मर्ज करने और फिर विभाजित करने के लिए कड़ी मेहनत क्यों करें? फाइलें अच्छी हैं। फाइलें काम करती हैं। यह बहुत बुरा लगता है। मैं कहूंगा कि शायद सभी लॉग्स को अलग-अलग टैग्स के साथ सिसलॉग में पाइप कर दें, लेकिन मुझे कहना होगा, अगर मेरी टीम में किसी ने यह सुझाव दिया है .. तो मैं निराश हो जाऊंगा।
असफ लवी

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

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

@AssafLavie आपको इसे एक उत्तर में लिखना चाहिए जो कि अपडाउन कर सके। IMHO यह देखने का एक बिल्कुल वैध बिंदु है।
डैन कॉर्निलेस्कु

2
मैं इसी सवाल के साथ यहां आया था। साधारण तथ्य यह है कि डॉकटर की अंतर्निहित लॉगिंग कार्यक्षमता stdout / stderr पर जाने वाली हर चीज पर निर्भर करती है, इसलिए लॉगिंग ड्राइवर और इसके आसपास निर्माण करने वाले 3 पार्टी टूल्स का पारिस्थितिकी तंत्र भी करता है। मुझे अपने सभी लॉग्स को होस्ट वॉल्यूम में भी डंप करने का प्रलोभन है, लेकिन मुझे पता है कि मुझे वापस जाना होगा और यह प्रबंध करना होगा कि जब मेरे कंटेनर k8s या ओपनशफ्ट या गीक या जो भी चलें, जबकि अगर मैं डॉक का पालन करता हूं stdout दृष्टिकोण यह बहुत चिकनी हो जाएगा। इस बीच मैं इस वैध सवाल के जवाब की तलाश में रहता हूं
Rhubarb

जवाबों:


13

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

एक "साइडकार" कोई भी डॉकटर कंटेनर होता है जिसे आप किसी अन्य डॉकटर कंटेनर के साथ किसी तरह से काम करने के लिए उपयोग करते हैं। इस मामले में आपके प्रत्येक तीन लॉग के लिए आपके पास एक अलग कंटेनर होगा जो स्केडआउट में लॉग और आउटपुट को स्कैन करता है या पूंछता है।

इस तरह से आपके प्रत्येक लॉग-साइडकार-कंटेनरों का अपना डॉक-लॉग होता है जो अपने स्वयं के स्टडआउट से होता है। इस तरह अलग होने के नाते, आप अलग करने या एकत्र करने के लिए मानक डॉकटर (और कुबेरनेट्स, आदि) प्रथाओं का उपयोग कर सकते हैं। यहां बताया गया है कि कुबेरनेट्स पृष्ठ का क्या कहना है:

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

डॉकिंग दस्तावेज़ों में वर्णित विभिन्न कंटेनरों से लॉग पर लागू होने वाले टैगिंग में "अलग लॉग स्ट्रीम" स्टेम, डॉकटर पर लागू होता है:

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


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

8

उन्हें विभाजित करने के लिए उन्हें एक धारा में विलय करने का विचार बाद में दर्दनाक लगता है। मेरे पास ऐसा करने का कोई कारण नहीं है, लेकिन यहाँ मैं शुरू करूँगा:

  • जब आप docker कंटेनर चलाते हैं, तो एक वॉल्यूम बनाएँ, जिससे होस्ट से लॉग / शिप देखना आसान होगा।
  • अपने लॉग कलेक्टर में लॉग को शिप करने के लिए Remote_syslog2 जैसी किसी चीज़ का उपयोग करें

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


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