Wie man php-fpm dazu bringt, sich in stdout / stderr anzumelden, wenn es in einem Docker-Container läuft

18

Ich habe php-fpm in einem Docker-Container und Dockerfilebearbeite die fpm-Konfigurationsdatei ( /etc/php5/fpm/pool.d/www.conf), um Zugriffsprotokolle /var/log/fpm-access.logund Fehlerprotokolle einzurichten /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

Das funktioniert gut - ich kann eine Shell in den Container bekommen, um die Protokolle zu sehen. Aber ... es ist keine bewährte Methode.

Das Problem ist, wenn ich versuche, den Docker Log Collector zu verwenden. Ich benötige php-fpm, um mich bei stdout oder stderr anzumelden, damit Docker sie erfassen und dem docker logsBefehl zur Verfügung stellen kann.

Ich habe versucht, dies in Dockerfile(eine Idee, die ich aus dem offiziellen Nginx Docker-Image kopiert habe ):

# 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

Dies funktioniert nicht. Es werden keine Zugriffsprotokolle angezeigt. docker logsIch versuche herauszufinden, warum. Hat es jemand anderes, der fpm in docker verwendet, geschafft, die Protokollierung für den Docker-Protokollsammler zum Laufen zu bringen?

Tom
quelle

Antworten:

24

In Ordnung, der Weg dazu ist, den Fehler und die Zugriffsprotokolle an die folgende Adresse zu senden:

/proc/self/fd/2

In php5-fpm.logadd:

access.log = /proc/self/fd/2
error_log = /proc/self/fd/2
Spyros Lambrinidis
quelle
Es kann /dev/stdin ~ /dev/fd/0 ~ /proc/self/fd/0und /dev/stdoutund /dev/stderrVarianten geben. Es könnte einfacher sein, sich an die Verwendung zu erinnern /dev/stdin.
CMCDragonkai
1
Es gibt einen Fehler in der Antwort - es ist "access_log" nicht "access.log"
rfay
2
Es scheint so zu sein access.log: github.com/docker-library/php/blob/…
CommandZ
13

Beachten Sie, dass die in fpm config gebackene Version des offiziellen PHP-fpm-Docker-Image in die Standard-Streams schreibt:

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
quelle
Danke, das ist interessant. Ich wusste nicht, dass es jetzt ein offizielles Bild gibt
Tom
1
Auf welches Docker-Image beziehen Sie sich? Ich habe php: 7-fpm ausgeführt und es scheint keine Fehler zu protokollieren stderr.
Derek
1

PHP-FPM-Protokolle werden nur in STDERR angezeigt. Sie können also bei Bedarf einen Symlink fpm.logzu /dev/stderrerstellen.

ln -sf /dev/stderr /var/log/fpm-access.log
ln -sf /dev/stderr /var/log/fpm-error.log
Und ich
quelle
4
Diese Lösung wurde in der Frage angegeben und der Fragesteller gab an, dass es nicht funktioniert hat. Vielleicht können Sie angeben, wie er es in seine Docking-Datei laden kann, damit es ordnungsgemäß funktioniert, oder andere Diagnosen, die er für seinen Container durchführen kann?
Andrew Domaszek