我正在为Symfony应用程序构建docker映像。在此图像中,我想将Symfony日志流式传输到stdout。因此,类似于nginx日志的配置方式,我在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致命错误:无法打开消息“流或文件“ /var/www/project/app/logs/prod.log”的未捕获异常’UnexpectedValueException’:/无法打开流:无此类文件或目录var / www / project / app / cache / prod / classes.php:5808 堆栈跟踪: #0 /var/www/project/app/cache/prod/classes.php(5746):Monolog \ Handler \ StreamHandler-> write (数组) #1 /var/www/project/app/cache/prod/classes.php(5917):Monolog \ Handler \ AbstractProcessingHandler-> handle(Array) #2 /var/www/project/app/cache/prod/classes.php /classes.php(6207):Monolog \ Handler \ FingersCrossedHandler->处理(数组) #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’,’Fatal Error: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
有什么建议么 ?
借助Monolog,将日志发送到stdout / stderr非常容易。我的示例使用的是stderr,但我认为与stdout相同。
您无需输入日志文件,只需输入首选的流路径
path: "php://stderr"
但是您还没有完成。您还必须相应地配置PHP。工人必须捕获其过程的输出,并将该输出再次记录到其stderr。
PHP配置
#/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配置
# 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容器中使用任何过程控制系统,则必须确保该系统也记录到stdout(或stderr)。
主管示例:
[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
总而言之,请确保: