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

Posted

技术标签:

【中文标题】Monolog stdout/stderr 记录到 Docker 中的当前终端进程【英文标题】:Monolog stdout/stderr logs to current terminal process in Docker 【发布时间】:2019-07-07 22:17:14 【问题描述】:

我有一个在 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(或任何工作进程)进程?

【问题讨论】:

【参考方案1】:

记录到文件/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'
        ...

也许您可以检查 this 指向的位置并重定向到那里 (docker exec aContainer ls -l /proc/1/fd/2),但这可能会根据容器启动而改变。

不确定它是否理想,但它可以工作(当 symfony 具有 /proc/1/fd/* 的写入权限时)。

【讨论】:

刚发现我不是第一个有重定向到/proc/1/fd/1的想法的人:***.com/a/46220104/4124767

以上是关于Monolog stdout/stderr 记录到 Docker 中的当前终端进程的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在谷歌部署管理器中打印到stdout,stderr或日志文件?

命令输出(stdout,stderr)未重定向到管道

stdout/stderr作用学习

如何将 stdout、stderr 重新路由回 /dev/tty

使用参数 + stdout + stderr 从命令行调用 MFC 应用程序

如何在 Perl 中读取和写入大缓冲区到进程 stdin/stdout/stderr?