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 重新路由回 /dev/tty