Apache2 लिखना stdout / stderr पर लॉग करता है?


29

मैं Apache2 को एक डॉकटर कंटेनर में चला रहा हूं, और डिस्क पर कुछ भी नहीं लिखना चाहता, लेखन को stdout और stderr पर लिख रहा हूं। मैंने इसे करने के लिए कुछ अलग तरीके देखे हैं ( सुपरवाइर्ड और stdout / stderr , Apache एक्सेस लॉग टू stdout ) लेकिन ये हैक की तरह प्रतीत होते हैं। क्या डिफ़ॉल्ट रूप से ऐसा करने का कोई तरीका नहीं है?

स्पष्ट होने के लिए, मैं लॉग को पूंछ नहीं करना चाहता हूं, क्योंकि इससे कंटेनर में डिस्क पर लिखी जाने वाली चीजें हो जाएंगी।


क्या आप समस्या निवारण / डीबगिंग उद्देश्यों के लिए उन लॉग को आसानी से एक्सेस नहीं करना चाहते हैं? इसके बजाय सिर्फ उन्हें (r) syslog सर्वर पर क्यों नहीं लिखें?
HTTP500

@ HTTP500 - वे डॉकटर कंटेनर के बाहर कब्जा कर लेते हैं।
मैट

यदि आप उपयोग करते हैं: FROM php: 5.6-apache, जिसमें पहले से ही stdout और stderr में लॉग शामिल हैं।
मार्टलार्क

जवाबों:


30
  ErrorLog /dev/stderr
  TransferLog /dev/stdout

ubuntu और सेंटो पर काम करता है मेरे लिए


किस फाइल में जाना चाहिए यह pls
अलेक्जेंडर मिल्स

यह आप domain.confफ़ाइल में जाता है या .htaccessयदि आप उपयोग नहीं कर रहे हैं conf
टायलर क्रिश्चियन

25

Apache2 पैकेज स्थापित होने के बाद इसे अपने Dockerfile में रखने के बारे में कैसे?

RUN ln -sf /proc/self/fd/1 /var/log/apache2/access.log && \
    ln -sf /proc/self/fd/1 /var/log/apache2/error.log

यह मानते हुए कि यह लॉग्स का मार्ग है। यह Ubuntu 14.04 के लिए है और यह Ubuntu 16.04 के लिए भी काम करता है।

नोट: यदि आप निश्चित हैं कि प्रतीकात्मक लिंक /dev/stdoutया /proc/stderrवहाँ हैं, तो आप उन का उपयोग भी कर सकते हैं। मैं वास्तविक फ़ाइल का पथ पसंद करता हूं क्योंकि यह वर्तमान की गारंटी है।


उबंटू 16.04 :) के साथ भी बढ़िया काम करता है
ओकी ओथ

1
अरे, यह एक सरल हैक है! अपाचे एक नियमित फ़ाइल खोलने का प्रयास करता है, लेकिन सिम्लिंक के माध्यम से अपने स्वयं के दृष्टिकोण से अपने स्वयं के स्टडआउट पर पुनर्निर्देशित हो जाता है।
joonas.fi

1
बस धन्यवाद कहना चाहता हूँ ... आधिकारिक Apache httpd 2.4 docker कंटेनर ssl को सक्षम करने के बाद लॉग लिखने में विफल रहता है। इन पंक्तियों को जोड़ना + ssl_request_log Dockerfile को जो httpd2.4 से खींचता है, ने काम किया।
जं।

3
आप संक्षिप्त / खरीद / स्व / fd / 1 को / dev / stdout के रूप में कर सकते हैं। वे बिलकुल एक जैसे हैं।
चक एडम्स

@ChuckAdams - वे एक नरम लिंक हैं और सामान्य रूप से वहाँ हैं, लेकिन कोई गारंटी नहीं है कि छवियों का निर्माण करते समय वे मौजूद हैं। विशेष रूप से सूक्ष्म छवियों को काटें। जबकि कर्नेल हमेशा निर्यात करेगा / खरीदेगा / स्वयं / fd / 1 & 2.
मैट

1

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

GlobalLog "| cat - " gelf
ErrorLog "| cat - " 

LogFormat "{ \"apache_log\": \"ACCESS\", \"app_name\": \"apache\",  \"Connection\": \"%{X-Forwarded-Proto}i:%{X-Forwarded-Port}i \", \"X-Forwarded-For\": \"%{X-Forwarded-For}i\",  \"version\": \"1.1\", \"vhost\": \"%V\", \"short_message\": \"%r\", \"timestamp\": %{%s}t, \"level\": 6, \"user_agent\": \"%{User-Agent}i\", \"source_ip\": \"%a\", \"duration_usec\": %D, \"duration_sec\": %T, \"request_size_byte\": %O, \"http_status\": %s, \"http_request_path\": \"%U\", \"http_request\": \"%U%q\", \"http_method\": \"%m\", \"http_referer\": \"%{Referer}i\", \"X-Powered-By\": \"%{X-Powered-By}i\" }" gelf

ErrorLogFormat "{ \"app_name\": \"apache\",  \"apache_log\": \"ERROR\", \"time\":\"%{%Y-%m-%d}tT%{%T}t.%{msec_frac}tZ\", \"function\" : \"[%-m:%l]\" , \"process\" : \" [pid %P:tid %T] \" , \"message\" : \"%M\" ,\ \"referer\"\ : \" %{Referer}i \" }"

एक gelf लॉगिंग मॉड्यूल भी है, इसलिए यदि आप चाहें तो अपाचे से सीधे एक ग्रेगल टाइप सर्वर पर स्ट्रीम कर सकते हैं

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