วิธีรับ php-fpm เพื่อเข้าสู่ระบบ stdout / stderr เมื่อทำงานในคอนเทนเนอร์นักเทียบท่า


18

ฉันมี php-fpm ในคอนเทนเนอร์ docker และในDockerfileฉันแก้ไขไฟล์ config fpm ( /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

ใช้งานได้ดี - ฉันสามารถนำเชลล์ลงในคอนเทนเนอร์เพื่อดูบันทึก แต่ ... มันไม่ใช่วิธีปฏิบัติที่ดีที่สุด

ปัญหาคือเมื่อฉันพยายามใช้ตัวรวบรวมบันทึกข้อมูลนักเทียบท่า - ฉันต้องการ php-fpm เพื่อเข้าสู่ระบบไปยัง stdout หรือ stderr เพื่อให้นักเทียบท่าสามารถจับภาพพวกเขาและให้docker logsคำสั่งแก่พวกเขา

ฉันพยายามทำสิ่งนี้ในDockerfile(ซึ่งเป็นความคิดที่ฉันคัดลอกมาจากรูปภาพ nginx docker อย่างเป็นทางการ ):

# 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- ฉันพยายามคิดว่าเพราะอะไร มีใครบ้างที่ใช้ fpm ในเครื่องมือจัดการนักเทียบท่าเพื่อให้การบันทึกทำงานกับตัวรวบรวมบันทึกนักเทียบหรือไม่

คำตอบ:


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/…
CommandZ

13

โปรดทราบว่าการอบในการกำหนดค่าfpmสำหรับภาพล่าสุดของนักเทียบท่า PHP fpmอย่างเป็นทางการเขียนไปยังสตรีมมาตรฐาน:

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และจะไม่ปรากฏที่จะเข้าสู่ระบบข้อผิดพลาด
Derek

1

บันทึก PHP-FPM จะปรากฏใน STDERR เท่านั้นดังนั้นคุณสามารถเชื่อมโยงfpm.logไปยัง/dev/stderrหากคุณต้องการ

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

4
วิธีการแก้ปัญหานี้ได้รับในคำถามและผู้ถามระบุว่ามันไม่ทำงาน บางทีคุณสามารถระบุวิธีที่เขาสามารถโหลดมันใน dockerfile ของเขาเพื่อให้มันทำงานได้อย่างถูกต้องหรือการวินิจฉัยอื่น ๆ ที่เขาสามารถทำได้ในภาชนะของเขา?
Andrew Domaszek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.