2

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

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

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

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

4

3 回答 3

1

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

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

于 2015-06-02T21:41:45.243 回答
0

你检查过 Logentries Docker 日志集成吗?

于 2015-05-31T20:58:27.447 回答
0

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

只需像这样使用 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 日志工具从这些容器中分别管理日志。

于 2016-09-28T12:31:25.857 回答