मैं अनुपालन में एक 3-पार्टी एप्लिकेशन तैनात कर रहा हूं 12 कारक सलाहकार, और बिंदुओं में से एक बताता है कि एप्लिकेशन लॉग को स्टडआउट/स्टैडर पर मुद्रित किया जाना चाहिए: फिर क्लस्टरिंग सॉफ्टवेयर इसे एकत्र कर सकता है ।
हालांकि, एप्लिकेशन केवल फाइलों या सिसलॉग को लिख सकता है । मैं इसके बजाय इन लॉग को कैसे प्रिंट करूं?
इस तरह, हम एप्लिकेशन को कॉन्फ़िगर करते हैं ताकि यह एक फ़ाइल में लॉग हो, और लगातार tail -f यह. सौभाग्य से, tail स्वीकार कर सकते हैं --pid PID: निर्दिष्ट प्रक्रिया से बाहर निकलने पर यह बाहर निकल जाएगा । हम डाल दिया $$ वहां: वर्तमान खोल का पीआईडी।
अंतिम चरण के रूप में, लॉन्च किया गया एप्लिकेशन है exec'ईडी, जिसका अर्थ है कि वर्तमान शेल पूरी तरह से उस एप्लिकेशन से बदल गया है ।
नोट: का उपयोग करके tail -F हम फ़ाइल नामों को सूचीबद्ध करते हैं, और यह उन्हें बाद में दिखाई देने पर भी पढ़ेगा!
अंत में, न्यूनतर Dockerfile:
FROM ubuntuADD run.sh /root/run.shCMD ['/root/run.sh']
नोट: कुछ बेहद अजीब काम करने के लिए tail -f व्यवहार (जो कहता है "को दूरस्थ फ़ाइल से बदल दिया गया है । इस नाम को देते हुए") मैंने एक और दृष्टिकोण की कोशिश की: सभी ज्ञात लॉग फाइलें बनाई गई हैं और स्टार्ट अप पर काट दी गई हैं: इस तरह मैं सुनिश्चित करता हूं कि वे मौजूद हैं, और उसके बाद ही-उन्हें पूंछ दें:
मुझे अपाचे 2 के साथ इस समस्या को हल करना पड़ा है, और कस्टमलॉग का उपयोग करके पुनः निर्देशित करने का प्रयास करने के लिए कुश्ती की है /proc/1/fd/1 लेकिन वह काम नहीं कर सका। मेरे कार्यान्वयन में, अपाचे के रूप में नहीं चल रहा था pid 1, इसलिए kolypto के जवाब जैसा है वैसा काम नहीं किया । पीटर का दृष्टिकोण सम्मोहक लग रहा था, इसलिए मैंने दोनों को मिला दिया और परिणाम आश्चर्यजनक रूप से काम करता है:
तकनीकी रूप से यह अपाचे रखता है access.log और error.log जा रहे हैं stdout और stderr जहां तक डॉकर लॉग कलेक्टर का संबंध है, लेकिन यह बहुत अच्छा होगा यदि दोनों को अलग करने का कोई तरीका हो बाहर कंटेनर, के लिए एक स्विच की तरह docker logs यह केवल एक या दूसरे को दिखाएगा।..