【问题标题】:How to view php logs information with php docker container?如何使用 php docker 容器查看 php 日志信息?
【发布时间】:2017-04-01 12:22:17
【问题描述】:

我有一个 php-fpm docker 容器。 php-fpm 在容器内运行,我可以在主机上获取 php-fpm 的日志吗?如果可以,怎么办?

【问题讨论】:

    标签: php docker containers


    【解决方案1】:

    常见的做法是容器内的应用程序不记录到文件,而是在stdout/stderr 上输出日志。容器主进程打印到stdout/stderr的任何内容都被docker内置的日志工具收集,可以使用docker logs <container-name>查看。

    默认情况下,日志使用json-file 日志驱动程序存储在每个容器中,并且在容器本身被删除时将被删除,但是还有其他可用的日志驱动程序(请参阅Configure logging drivers)允许您发送这些日志到(例如)syslogjournaldgelf

    另见

    【讨论】:

    • 如果您将 PHP 日志(如在应用程序日志中)发送到标准输出,它们将在 HTTP 响应中发送。也许有一种方法可以将他们的 stderr 发送到 php-fpm stderr 或类似的。
    • @giorgiosironi 这是官方 php-fpm 图像处理它的方式; github.com/docker-library/php/blob/…
    • 谢谢,但遇到了github.com/php/php-src/pull/1076,因此我放弃了 stderr 方法,因为 JSON 日志被php-fpm 引入的换行符和其他 cmets 破坏或损坏。
    【解决方案2】:

    Docker 容器的标准是登录到stdout/stderr。但是,这对于某些 PHP 运行时效果不佳,例如 php-fpm,因为日志在 lengthformat 中是如何被破坏的。

    因此,我改变了在卷上写入日志的方法,并使用 sidecar container 将其放入 stderr 并因此进入 Docker 的日志收集和/或您的协调器。

    示例docker-compose.yml 部分:

    cli:
        build: .
        volumes:
            - logs:/srv/annotations/var/logs
    logger:
        image: busybox:1.27.2
        volumes:
            - logs:/logs
        # be careful, this will only tail alredy existing files
        command: tail -f /logs/all.json
        depends_on:
            - cli
    

    【讨论】: