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



我在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不包含日志条目:https://i.stack.imgur.com/NRris.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/*写入permisison时(。

最新更新