Cara mendapatkan php-fpm untuk masuk ke stdout / stderr saat berjalan dalam wadah buruh pelabuhan

18

Saya memiliki php-fpm dalam wadah buruh pelabuhan dan di dalam Dockerfilesaya mengedit file konfigurasi fpm ( /etc/php5/fpm/pool.d/www.conf) untuk mengatur log akses untuk pergi ke /var/log/fpm-access.logdan log kesalahan untuk pergi ke /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

Ini berfungsi dengan baik - saya bisa mendapatkan shell ke dalam wadah untuk melihat log. Tapi ... itu bukan praktik terbaik.

Masalahnya adalah ketika saya mencoba menggunakan pengumpul log buruh pelabuhan - Saya perlu php-fpm untuk masuk ke stdout atau stderr sehingga buruh pelabuhan dapat menangkap mereka dan memberikannya kepada docker logsperintah.

Saya mencoba melakukan ini di Dockerfile(yang merupakan ide yang saya salin dari gambar nginx docker resmi ):

# 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

Ini tidak berfungsi - tidak ada log akses yang terlihat docker logs- Saya mencoba mencari tahu mengapa? Apakah ada orang lain yang menggunakan fpm di buruh pelabuhan berhasil log masuk ke kolektor log buruh pelabuhan?

Tom
sumber

Jawaban:

24

Oke, cara untuk melakukan ini adalah mengirim kesalahan dan log akses ke alamat berikut:

/proc/self/fd/2

Di php5-fpm.logtambahkan:

access.log = /proc/self/fd/2
error_log = /proc/self/fd/2
Spyros Lambrinidis
sumber
Mungkin saja ada /dev/stdin ~ /dev/fd/0 ~ /proc/self/fd/0, /dev/stdoutdan /dev/stderrvarian. Mungkin lebih mudah diingat untuk digunakan /dev/stdin.
CMCDragonkai
1
Ada kesalahan dalam jawabannya - ini "access_log" bukan "access.log"
rfay
2
Tampaknya itu adalah access.log: github.com/docker-library/php/blob/…
CommandZ
13

Perhatikan bahwa dipanggang dalam konfigurasi fpm untuk versi terbaru dari gambar docker PHP fpm resmi menulis ke stream standar:

error_log = /proc/self/fd/2

...

; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2
Darren Gordon
sumber
Terima kasih, itu menarik. Saya tidak tahu bahwa sekarang ada gambar resmi
Tom
1
Gambar buruh pelabuhan mana yang Anda maksud? Saya menjalankan php: 7-fpm dan sepertinya bukan kesalahan logging stderr.
Derek
1

Log PHP-FPM hanya akan muncul di STDERR - jadi Anda dapat menyinkronkan fpm.logke /dev/stderrjika Anda mau.

ln -sf /dev/stderr /var/log/fpm-access.log
ln -sf /dev/stderr /var/log/fpm-error.log
Dan saya
sumber
4
Solusi ini diberikan dalam pertanyaan dan penanya menyatakan itu tidak berhasil. Mungkin Anda dapat menentukan bagaimana ia dapat memuatnya di dockerfile untuk membuatnya berfungsi dengan baik atau diagnostik lain yang dapat dilakukannya di wadahnya?
Andrew Domaszek