Symfony logs to stdout inside Docker container Symfony logs to stdout inside Docker container docker docker

Symfony logs to stdout inside Docker container


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.conferror_log = /proc/self/fd/2#/etc/php/7.0/fpm/pool.d/www.confcatch_workers_output = yes

Symfony Configuration

# app/config/config_prod.ymlmonolog:    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 loglevelloglevel=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


My config to get all php infos / warnings / errors to docker log (I am using php:7.1-apache image):

php.ini

log_errors = Onerror_reporting = E_ALL | E_STRICTerror_log = /dev/stderr

Symfony config

# app/config/config_prod.ymlmonolog:handlers:    main:        type: group        members: [logfile, dockerlog]    logfile:        type: stream        path: "%kernel.logs_dir%/%kernel.environment%.log"        level: debug        channels: ['!event', '!doctrine']    dockerlog:        type: stream        path:  "php://stderr"        level: debug        channels: ['!event', '!doctrine']

troubleshooting:

  • check symfony environment (prod/dev/test)
  • clear symfony cache maybe
  • rebuild container, if you copy php.ini in dockerfile