2014-07-17 11 views
29

Heroku अपने Twelve-Factor App manifest के रूप में सरल इवेंट स्ट्रीम में लॉग वर्णन करता है:डॉकर के साथ माइक्रोस्कोप आर्किटेक्चर में लॉग कैसे शिप करें?

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

इसके अतिरिक्त, ऐप्स को "पर्यावरण" पर कार्य छोड़कर stdout पर लॉग लिखना चाहिए।

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

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

तो विश्वसनीयता, दक्षता और उपयोग में आसानी के मामले में डॉकर पर्यावरण में इसे प्राप्त करने का सबसे अच्छा तरीका क्या है? मुझे लगता है कि निम्न सवालों दिमाग में आते हैं:

  • यह डोकर की अपनी लॉग सुविधा (docker logs) पर भरोसा करने के लिए सुरक्षित है?
  • क्या डॉकर को अनचाहे चलाने के लिए सुरक्षित है और लॉगिंग स्ट्रीम के रूप में इसके आउटपुट पर विचार करना सुरक्षित है?
  • stdout को सीधे फ़ाइल (डिस्क स्थान) पर रीडायरेक्ट किया जा सकता है?
  • यदि फ़ाइल का उपयोग करना है, तो यह डॉकर छवि या बाध्य मात्रा (docker run --volume=[]) के अंदर होना चाहिए?
  • क्या तर्कांकन आवश्यक है?
  • क्या यह सीधे एक लॉगशिपर (और कौन सा लॉगशिपर) में stdout को रीडायरेक्ट करना सुरक्षित है?
  • क्या नामित पाइप (उर्फ फीफो) एक विकल्प है?
  • (अधिक सवाल?)

उत्तर

28

डोकर 1.6 introduced लॉग उत्पादन पर अधिक नियंत्रण प्रदान करने के लिए logging drivers की धारणा। --log-driver ध्वज कॉन्फ़िगर करता है जहां stdout & stderr किसी कंटेनर में चल रही प्रक्रिया से निर्देशित किया जाना चाहिए। Configuring Logging drivers भी देखें।

कई ड्राइवर उपलब्ध हैं। ध्यान दें कि json-file को छोड़कर इनमें से सभी कंटेनर लॉग एकत्र करने के लिए docker logs के उपयोग को अक्षम करते हैं।

  • कोई नहीं - कंटेनर लॉग अक्षम करें।
  • जेसन-फाइल - पहले जैसा किया गया था, जेसन प्रारूपित stdout /var/lib/docker/containers/<containerid>/<containerid>-json.log
  • syslog - syslog को संदेश लिखता है। टीसीपी, यूडीपी या यूनिक्स डोमेन सॉकेट के माध्यम से एक निर्दिष्ट syslog पर लॉग संदेशों को प्रत्यक्ष करने के लिए --log-opt को भी स्वीकार करता है। docker logs
  • पत्रिका - सिस्टमड जर्नल को भी लिखता है।
  • * gelf - ग्रेलॉग विस्तारित लॉग प्रारूप (जीईएलएफ)। जीईएलएफ एंडपॉइंट जैसे ग्रेलॉग या लॉगस्टैश
  • * फ्लेंटड - fluentd पर कंटेनर लॉग भेजें। Flentd के पते को अनुकूलित करने और लॉग संदेशों के साथ टैग भेजने के लिए कुछ विकल्प स्वीकार करता है।
  • ** awslogs - लिखता है एडब्ल्यूएस CloudWatch लॉग्स को संदेश लॉग इन करें डोकर 1,8

    ** न्यू डोकर 1,9

    उदाहरण के लिए में में

* नई:

docker run --log-driver=syslog --log-opt syslog-address=tcp://10.0.0.10:1514 ... 

यह सॉफ़्टवेयर के लिए डॉकर-अनुशंसित समाधान है जो लिखता है इसके लॉग संदेश stdout & stderr पर हैं। हालांकि, कुछ सॉफ्टवेयर stdout/stderr पर लॉग संदेश नहीं लिखते हैं। उदाहरण के लिए, वे लॉग फाइलों या syslog को लिखने के लिए लिखते हैं। उन मामलों में, नीचे दिए गए मूल उत्तर से कुछ विवरण अभी भी लागू होते हैं। सारांश यह है:।

अनुप्रयोग एक स्थानीय लॉग फ़ाइल के लिए लिखता है, तो मेजबान से एक मात्रा माउंट (या कंटेनर में एक data-only container का उपयोग करें और उस स्थान पर गए संदेशों लॉग ऑन लिखने

एप्लिकेशन syslog में लिखता है, अनुप्रयोग, इसके विन्यास में किसी syslog endpoint स्वीकार करता है मेजबान के syslog डेमॉन कॉन्फ़िगर करते हैं

  • -v /dev/log:/dev/log का उपयोग कर कंटेनर के लिए मेजबान के syslog सॉकेट (/dev/log) माउंट द्वारा मेजबान के syslog में भेजें
  • : वहाँ कई विकल्प हैं। सुनने के लिए डॉकर ब्रिज नेटवर्क पर टीसीपी और/या यूडीपी, और उस एंडपॉइंट का उपयोग करें। या बस रिमोट syslog होस्ट को भेजें।
  • एक कंटेनर में एक syslog डिमन चलाएं, और अन्य चलने वाले कंटेनर से इसे एक्सेस करने के लिए डॉकर लिंक का उपयोग करें।
  • उपयोग logspout लिए स्वचालित रूप से मार्ग कंटेनर यूडीपी

के माध्यम से किसी दूरस्थ syslog के लिए लॉग भूल जाते हैं कि एक कंटेनर के भीतर किसी भी लॉग बस के रूप में वे एक मेजबान ओएस पर होगा घुमाया जाना चाहिए न करें।


डोकर के लिए मूल उत्तर पूर्व-1,6

यह डोकर की अपनी लॉग सुविधा (डोकर लॉग) पर भरोसा करने के लिए सुरक्षित है?

docker logs हर बार पूरी स्ट्रीम प्रिंट करता है, न केवल नए लॉग, इसलिए यह उचित नहीं है।docker logs --followtail -f जैसी कार्यक्षमता देगा, लेकिन फिर आपके पास एक डॉकर सीएलआई कमांड हर समय चल रहा है। इस प्रकार सुरक्षितdocker logs चलाने के लिए, यह इष्टतम नहीं है।

क्या यह डॉकर को अनदेखा चलाने के लिए सुरक्षित है और लॉगिंग स्ट्रीम के रूप में इसके आउटपुट पर विचार करना सुरक्षित है?

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

क्या स्टडआउट सीधे फ़ाइल (डिस्क स्पेस) पर रीडायरेक्ट किया जा सकता है?

आप इसे docker run ... > logfile के साथ कर सकते हैं, लेकिन यह स्वचालित और प्रबंधित करने के लिए भंगुर और कठिन लगता है।

यदि फ़ाइल का उपयोग करना है, तो यह डॉकर छवि या बाउंड वॉल्यूम (डॉकर रन - वोल्म्यूम = []) के अंदर होना चाहिए?

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

क्या तर्कांकन आवश्यक है?

निश्चित रूप से, यदि ऐप लॉग लिखता है तो आपको उन्हें देशी ओएस वातावरण की तरह घूमने की आवश्यकता होती है। लेकिन अगर आप कंटेनर के अंदर लिखते हैं तो यह कठिन होता है क्योंकि लॉग फ़ाइल स्थान अनुमानित नहीं है। यदि आप होस्ट पर घुमाते हैं, तो लॉग फ़ाइल नीचे रहती है, उदाहरण के लिए devicemapper के साथ स्टोरेज ड्राइवर, /var/lib/docker/devicemapper/mnt/<containerid>/rootfs/... के रूप में। लॉगरोटेट को उस पथ के नीचे लॉग ढूंढने के लिए कुछ बदसूरत रैपर की आवश्यकता होगी।

क्या यह सीधे एक लॉगशिपर (और कौन सा लॉगशिपर) में stdout को रीडायरेक्ट करना सुरक्षित है?

syslog का उपयोग करने के लिए बेहतर और लॉग कलेक्टर syslog से निपटने दें।

क्या नामित पाइप (उर्फ फीफो) एक विकल्प है?

एक नामित पाइप आदर्श नहीं है क्योंकि यदि पाइप के पढ़ने का अंत मर जाता है, तो लेखक (कंटेनर) को टूटी हुई पाइप मिल जाएगी। भले ही उस ईवेंट को ऐप द्वारा संभाला जाता है, फिर भी इसे तब तक अवरुद्ध कर दिया जाएगा जब तक एक पाठक फिर से न हो। इसके अलावा यह docker logs circumvents।

यह भी देखें post on fluentd with docker

जेफ लिंडसे के उपकरण logspout देखें जो कंटेनर चलाने से लॉग एकत्र करता है और उन्हें इच्छित करता है।

अंत में, ध्यान दें कि /var/lib/docker/containers/<containerid>/<containerid>-json.log में मेजबान पर एक फ़ाइल में कंटेनर लॉग से stdout।

+0

ध्यान दें कि यह तकनीकी भी है: किसी अन्य कंटेनर से syslog डिमन का उपयोग करना: http: //jpetazzo.github।आईओ/2014/08/24/syslog-docker/ –

+0

कॉन्फ़िगर लॉगिंग ड्राइवर लिंक टूटा हुआ है। होना चाहिए: https://docs.docker.com/engine/admin/logging/overview/ – HellishHeat

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