Jak zdobyć php-fpm, aby logował się do stdout / stderr podczas działania w kontenerze dokera

18

Mam php-fpm w kontenerze dokowanym iw Dockerfileedytorze pliku konfiguracyjnego fpm ( /etc/php5/fpm/pool.d/www.conf), aby skonfigurować dzienniki dostępu, aby przejść do /var/log/fpm-access.logi dzienniki błędów, aby przejść do /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

To działa dobrze - mogę dostać powłokę do kontenera, aby zobaczyć dzienniki. Ale ... to nie jest najlepsza praktyka.

Problem polega na tym, że próbuję użyć modułu gromadzącego dzienniki dokera - potrzebuję php-fpm, aby zalogować się do standardowego wyjścia standardowego lub standardowego, aby doktor mógł je przechwycić i dostarczyć do docker logspolecenia.

Próbowałem to zrobić w Dockerfile(który pomysł skopiowałem z oficjalnego obrazu dokera nginx ):

# 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

To nie działa - nie widać dzienników dostępu docker logs- Próbuję dowiedzieć się, dlaczego? Czy ktoś inny, kto korzysta z fpm w oknie dokowanym, zdołał uruchomić rejestrowanie w module gromadzącym dzienniki dokera?

Tomek
źródło

Odpowiedzi:

24

Ok, sposobem na to jest wysłanie błędu i dzienników dostępu na następujący adres:

/proc/self/fd/2

W php5-fpm.logdodatku:

access.log = /proc/self/fd/2
error_log = /proc/self/fd/2
Spyros Lambrinidis
źródło
Jest to możliwe, aby istniała /dev/stdin ~ /dev/fd/0 ~ /proc/self/fd/0, a /dev/stdouti /dev/stderrwarianty. Może być łatwiej zapamiętać w użyciu /dev/stdin.
CMCDragonkai
1
Odpowiedź zawiera błąd - jest to „access_log”, a nie „access.log”
rfay
2
Wygląda na to, że jest to access.log: github.com/docker-library/php/blob/…
CommandZ
13

Zauważ, że wypieczona w konfiguracji fpm najnowsza wersja oficjalnego obrazu dokera fpm PHP zapisuje do standardowych strumieni:

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
źródło
Dzięki, to interesujące. Nie wiedziałem, że jest teraz oficjalny obraz
Tom
1
Który obraz dokera masz na myśli? Uruchomiłem php: 7-fpm i wygląda na to, że nie rejestruje błędów stderr.
Derek
1

Dzienniki PHP-FPM pojawią się tylko w STDERR - więc możesz dowiązać fpm.logdo nich, /dev/stderrjeśli chcesz.

ln -sf /dev/stderr /var/log/fpm-access.log
ln -sf /dev/stderr /var/log/fpm-error.log
I ja
źródło
4
To rozwiązanie zostało podane w pytaniu, a pytający stwierdził, że nie działa. Może możesz sprecyzować, w jaki sposób może załadować go do swojego pliku dokowania, aby działał poprawnie, lub inną diagnostykę, którą może wykonać na swoim kontenerze?
Andrew Domaszek,