symfony - Monolog stdout/stderr 记录到 Docker 中的当前终端进程

标签 symfony docker monolog

我有一个在 Docker 中运行的 PHP/Symfony 应用程序,它使用 Monolog 登录到 stdout/stderr。这一切都很好,除非在容器内运行 Symfony 控制台命令。

monolog:
    handlers:
        stdout:
            type: filter
            handler: stdout_unfiltered
            max_level: notice
            channels: ['!event']

        stdout_unfiltered:
            type: stream
            level: debug
            path: 'php://stdout'

        stderr:
            type: stream
            level: warning
            channels: ['!event']
            path: 'php://stderr'

        console:
            type: console
            channels: ['!console', '!doctrine', '!event']
            process_psr_3_messages: false


问题在于,无论何时执行命令,“stdout”、“stderr”和“console”处理程序都会记录到当前终端进程。这会导致控制台输出困惑,并且 docker logs不包含日志条目:http://i.imgur.com/yB1IKrR.png .

是否有一种简单的方法可以始终将日志输出发送到 php-fpm(或任何工作程序)进程?

最佳答案

登录到文件 /proc/1/fd/1 (或 fd/2)

monolog:
    handlers:
        ...
        stdout_unfiltered:
            type: stream
            level: debug
            path: '/proc/1/fd/1'
        stderr:
            type: stream
            level: warning
            channels: ['!event']
            path: '/proc/1/fd/2'
        ...
也许您可以检查它指向的位置并重定向到那里( docker exec aContainer ls -l /proc/1/fd/2 ),但这可能会根据容器的启动而改变。
不确定它是否理想,但它有效(当 symfony 对/proc/1/fd/* 具有写入权限时)。

关于symfony - Monolog stdout/stderr 记录到 Docker 中的当前终端进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54681064/

相关文章:

php - 带有对象数组的 Symfony 2 对象,如何访问它们?

ssl - Elastic Beanstalk : load balancer DNS unreachable

symfony - 在 symfony 中记录 fatal error

php - 在示例 php 文件中使用 USE 和命名空间( Composer )

symfony-2.3 - 创建 channel 并将 channel 的日志写入其他文件

php - 电影数据库的sql symfony实体关系orm

symfony - 通过 Symfony 组件使用 unoconv 将 DOC 转换为 PDF

mysql - Doctrine2 实体与Where条件的关系

python - Gunicorn 导入错误 : cannot import name 'ALREADY_HANDLED' from 'eventlet.wsgi' in docker

android - 从主机连接到在 docker 容器内运行的 Android 模拟器