【问题标题】:Docker: Logging From Both App and Server In One ContainerDocker:在一个容器中同时从应用程序和服务器进行日志记录
【发布时间】:2015-04-09 22:15:11
【问题描述】:

我想使用像 Logentries 这样的集中式日志捕获器,但我不希望它的代理在我的所有容器中运行。因此,我计划让每个服务都记录到其容器的标准输出,然后通过 Docker API 或日志容器将其传递给 Logentries。

问题:如何处理需要输出两个日志的容器?如何在不引入其他日志记录机制的情况下保持它们的清洁和分离?

场景:我有一个 PHP 应用程序,它需要三个组件:Nginx、PHP-FPM 和我的代码。我可以将 Nginx 和 PHP-FPM 放在单独的 Docker 容器中,所以它们会有单独的日志,所以我们很好。但是我的 PHP 必须与 Nginx 位于同一个容器中,这样才能提供服务,对吗?
当我的应用程序需要记录某些内容时(使用 Monolog),我可以将其发送到容器的标准输出(例如,使日志文件成为 /dev/stdout 的链接),但是我无法将 Nginx 和我的应用程序的日志分开。

有没有办法做到这一点?还是我看错了?有没有更好的方法在 Docker 中运行 Nginx + PHP?

【问题讨论】:

  • 我对日志方面不太了解,但是“但是我的 PHP 必须与 Nginx 位于同一个容器中,这样才能提供服务,对吧?”绝对是一个错误的假设。我在单独的容器中运行它们,它们通过 TCP/IP 进行合作。
  • 你是对的。这是一个错误的假设,但我的 PHP 确实必须与 PHP-FPM 在同一个容器中,这会带来相同类型的问题。

标签: php logging nginx docker logentries


【解决方案1】:

由于没有找到更好的解决方案,我最终将 Laravel/Monolog 日志记录到已安装卷中的文件中。 Logentries 代理然后从容器的主机收集日志。这允许我的容器尽可能保持清洁,因为我没有安装 Supervisor 或日志记录代理,并且它允许运行容器的任何东西以最小的努力访问日志。

记录到标准输出结果不是一个选项,因为 PHP-FPM 包装了子进程的每一行输出,使其难以解析,并且对于 JSON 日志,完全没用。 (见https://groups.google.com/forum/#!topic/highload-php-en/VXDN8-Ox9-M

【讨论】:

    【解决方案2】:

    您查看过 Logentries Docker logging integration 吗?

    【讨论】:

    • 是的,但这只是包装了 Docker 日志 API,每个容器只支持一个日志。
    • @jchamberlain 除非我误解,不使用 Docker 日志记录 API,您的选择是:1) 使用类似 phusion base image 的东西,它可以让您运行多个进程,然后设置Logentries 代理或安装和配置 syslog/rsyslog/... 或 2) 将我们的客户端库之一与您各自的项目集成。 HTH
    【解决方案3】:

    绝对可以将您的应用程序分成两个容器,这实际上是推荐的方法(记住:每个容器一个进程)。

    只需像这样使用 docker-compose.yml 文件(或手动启动它们):

    services:
      app:
        build: .
        ports:
          - 9000
    
      nginx:
        image: nginx
        ports:
          - "80:80"
        volumes:
          - $PWD/nginx.conf:/etc/nginx/conf.d/default.conf
    

    还有一个像这样的 nginx.conf 文件:

    server {
        listen  80;
    
        location / {
            try_files $uri /index.php$is_args$args;
        }
    
        location ~ ^/.+\.php(/|$) {
            fastcgi_pass app:9000;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
    

    使用这种配置,您现在将拥有 2 个容器,您可以使用 docker 日志工具从这些容器中分别管理日志。

    【讨论】:

    • 感谢您的意见,但您误解了最初的问题。将 PHP-FPM 和 Nginx 放入不同的容器后,仍然需要从 PHP 容器中输出两份日志:一份用于 FPM,一份用于应用程序本身。
    • 好的,也许可以简单地使用类似logstash的过滤器将fpm日志与应用日志分开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2023-03-23
    • 2017-02-04
    • 2022-09-29
    • 2023-03-30
    相关资源
    最近更新 更多