डॉक कंटेनर में चलने पर stdout / stderr पर लॉग इन करने के लिए php-fpm कैसे प्राप्त करें


18

मेरे पास एक docker कंटेनर में php-fpm है और Dockerfileमैं जाने के लिए fpm config फाइल ( /etc/php5/fpm/pool.d/www.conf) को एक्सेस लॉग्स में सेट करता हूं /var/log/fpm-access.logऔर जाने के लिए एरर लॉग्स को एडिट करता हूं /var/log/fpm-php.www.log:

# Do some php-fpm config
#  Redirect worker stdout and stderr into main error log
#  Activate the fpm access log
#  Enable display errors
#  Enable the error log
RUN sed -i '/^;catch_workers_output/ccatch_workers_output = yes' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;access.log/caccess.log = /var/log/fpm-access.log' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;php_flag\[display_errors\]/cphp_flag[display_errors] = off' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;php_admin_value\[error_log\]/cphp_admin_value[error_log] = /var/log/fpm-php.www.log' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;php_admin_flag\[log_errors\]/cphp_admin_flag[log_errors] = on' /etc/php5/fpm/pool.d/www.conf

यह ठीक काम करता है - मुझे लॉग देखने के लिए कंटेनर में एक शेल मिल सकता है। लेकिन ... यह सबसे अच्छा अभ्यास नहीं है।

समस्या यह है कि जब मैं डॉक लॉग कलेक्टर का उपयोग करने की कोशिश करता हूं - मुझे stdout या stderr में लॉग इन करने के लिए php-fpm की आवश्यकता होती है ताकि docker उन्हें पकड़ सके और उन्हें docker logsकमांड प्रदान कर सके ।

मैंने ऐसा करने की कोशिश की Dockerfile(जो कि एक विचार है जिसे मैंने आधिकारिक नग्नेक्स डॉकटर छवि से कॉपी किया है ):

# Redirect fpm logs to stdout and stderr so they are forwarded to the docker log collector
RUN ln -sf /dev/stdout /var/log/fpm-access.log && \
    ln -sf /dev/stderr /var/log/fpm-php.www.log

यह काम नहीं कर रहा है - कोई प्रवेश लॉग से नहीं देखा जाता है docker logs- मैं यह पता लगाने की कोशिश कर रहा हूं कि क्यों? क्या किसी और ने जो dopm में fpm का उपयोग किया है, वह docker log कलेक्टर को लॉगिंग कार्य करने के लिए प्रबंधित करता है?

जवाबों:


24

ठीक है, ऐसा करने का तरीका त्रुटि और एक्सेस लॉग को निम्न पते पर भेजना है:

/proc/self/fd/2

में php5-fpm.logजोड़ने:

access.log = /proc/self/fd/2
error_log = /proc/self/fd/2

यह वहाँ हो सकता है /dev/stdin ~ /dev/fd/0 ~ /proc/self/fd/0, /dev/stdoutऔर /dev/stderrवेरिएंट के लिए संभव है । उपयोग करने के लिए याद रखना आसान हो सकता है /dev/stdin
CMCDragonkai

1
उत्तर में एक त्रुटि है - यह "access_log" नहीं "access.log" है
rfay

2
ऐसा प्रतीत होता है कि यह है access.log: github.com/docker-library/php/blob/…
कमांड ज़ूल

13

ध्यान दें कि आधिकारिक PHP fpm docker छवि के नवीनतम संस्करण के लिए fpm config में पके हुए मानक धाराओं के लिए लिखते हैं:

error_log = /proc/self/fd/2

...

; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2

धन्यवाद, यह दिलचस्प है। मुझे नहीं पता था कि अब एक आधिकारिक छवि है
टॉम

1
आप किस छवि का उल्लेख कर रहे हैं? मैं php भागा: 7-fpm और यह लॉगिंग त्रुटियों के लिए प्रकट नहीं होता है stderr
डेरेक

1

पीएचपी-एफ पी एम लॉग केवल STDERR में दिखाई देगा - ताकि आप सिमलिंक कर सकते हैं fpm.logकरने के लिए /dev/stderrअगर आप चाहते हैं।

ln -sf /dev/stderr /var/log/fpm-access.log
ln -sf /dev/stderr /var/log/fpm-error.log

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