Symfonylogging到Docker容器内的stdout

我正在为Symfony应用程序构build一个docker镜像。 在这个图像中,我想将Symfony日志stream式传输到标准输出。 所以,类似于如何configurationnginx日志,我将这一行添加到我的Dockerfile中:

ln -sf /dev/stdout /var/www/project/app/logs/prod.log 

在容器内部,我可以看到:

 $ ls /var/www/project/app/logs/ -l total 12 -rw-r--r-- 1 501 games 4473 Jul 21 08:36 dev.log lrwxrwxrwx 1 501 games 11 Jul 21 08:35 prod.log -> /dev/stdout 

但是,该应用程序抛出以下错误:

PHP致命错误:未收到的exception“UnexpectedValueException”与消息“的stream或文件”/var/www/project/app/logs/prod.log“无法打开:无法打开stream:没有这样的文件或目录'在/无功/networking/项目/应用/caching/生产/ classes.php:5808
堆栈跟踪:
#0 /var/www/project/app/cache/prod/classes.php(5746):Monolog \ Handler \ StreamHandler-> write(Array)
#1 /var/www/project/app/cache/prod/classes.php(5917):Monolog \ Handler \ AbstractProcessingHandler-> handle(Array)
#2 /var/www/project/app/cache/prod/classes.php(6207):Monolog \ Handler \ FingersCrossedHandler-> handle(Array)
#3 /var/www/project/app/cache/prod/classes.php(6276):Monolog \ Logger-> addRecord(500,'致命错误:Un …',数组)
#4 /var/www/project/app/cache/prod/classes.php(1978):Monolog \ Logger-> log('critical','致命错误:Un …',Array)
#5 /var/www/project/app/cache/prod/classes.php(2034): Symfony \ Component \ Debug \ ErrorHandler-> handleException(Object(Symfony \ Component \ Debug \ Exception \ FatalErrorException),Array)
#6 [内部函数]:在5808行的/var/www/project/app/cache/prod/classes.php中的Symfony \ Component \ Debug \ E

有什么build议么 ?

在Monolog的帮助下,很容易login到标准输出/标准错误。 我的例子是使用标准错误,但我认为这是一样的标准输出。

您不必定义日志文件,只需input相应的streampath即可

 path: "php://stderr" 

但是你还没有完成。 您也必须相应地configurationPHP。 工人必须捕捉他们的stream程输出,并将这个输出再次logging到他们的stderr。

PHPconfiguration

 #/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 

Symfonyconfiguration

 # 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 

如果您在胖docker集装箱中使用任何过程控制系统,则必须确保此系统也logging到stdout。

与主pipe的例子:

 [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 

总而言之,确保:

  • 应用程序会logging到stdout / stderr
  • PHP捕获工作输出并logging到stderr
  • 可选:任何过程控制系统都必须将托pipe进程的输出转发到stdout