With the help of Monolog, it is very easy to send logs to stdout/stderr. My examples are using stderr, but I think it's the same with stdout.
Instead of defining a log file you just enter the preferred stream path
path: "php://stderr"
BUT you are not done yet. You also have to configure PHP accordingly. The workers have to catch the output of their processes and log this output again to their stderr.
PHP Configuration
#/etc/php/7.0/fpm/php-fpm.conf
error_log = /proc/self/fd/2
#/etc/php/7.0/fpm/pool.d/www.conf
catch_workers_output = yes
Symfony Configuration
# app/config/config_prod.yml
monolog:
handlers:
main:
type: fingers_crossed
action_level: error
handler: nested
nested:
type: stream
path: "php://stderr"
level: debug
console:
type: console
If you are using any process control system in a fat docker container you have to make sure that this system also logs to stdout (or stderr).
Example with supervisor:
[supervisord]
nodaemon=true
;@see http://blog.turret.io/basic-supervisor-logging-with-docker/
;we need the output from the controlled processes
;but this is only possible with lowered loglevel
loglevel=debug
All in all make sure that:
- The application logs to stdout/stderr
- PHP catches workers output and logs to stderr
- optional: any process control system has to forward output of managed processes to stdout/stderr
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…