Docker:在一个容器中同时从应用程序和服务器进行日志记录
Docker: Logging From Both App and Server In One Container
我想使用像 Logentries 这样的集中式日志收集器,但我不希望它的代理 运行ning 在我所有的容器中。因此,我计划让每个服务都记录到其容器的标准输出,然后通过 Docker API 或日志容器传递给 Logentries。
问题:一个容器需要输出两条日志怎么处理?如何在不引入其他日志记录机制的情况下保持它们的清洁和分离?
场景: 我有一个 PHP 应用程序,它需要三个组件:Nginx、PHP-FPM 和我的代码。我可以将 Nginx 和 PHP-FPM 放在单独的 Docker 容器中,所以它们会有单独的日志,所以我们在那里很好。但是我的 PHP 必须与 Nginx 在同一个容器中才能提供服务,对吗?
当我的应用程序需要记录某些内容时(使用 Monolog),我可以发送它到容器的标准输出(例如,将日志文件设为 link 到 /dev/stdout),但是我无法将 Nginx 和我的应用程序的日志分开。
有办法吗?还是我看错了? 运行 Nginx + PHP in Docker 有更好的方法吗?
你检查过 Logentries Docker logging integration 了吗?
由于没有找到更好的解决方案,我最终 Laravel/Monolog 登录到已安装卷中的文件。 Logentries 代理然后从容器的主机收集日志。这允许我的容器尽可能保持干净,因为我没有安装 Supervisor 或日志记录代理,并且它允许 运行 容器以最小的努力访问日志。
记录到 stdout 被证明不是一个选项,因为 PHP-FPM 包装了子进程的每一行输出以使其难以解析,并且在 [=17= 的情况下] 日志,完全没用。 (参见 https://groups.google.com/forum/#!topic/highload-php-en/VXDN8-Ox9-M)
绝对可以将您的应用程序分成两个容器,这实际上是推荐的方法(记住:每个容器一个进程)。
只需像这样使用 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 日志记录工具分别管理日志。
我想使用像 Logentries 这样的集中式日志收集器,但我不希望它的代理 运行ning 在我所有的容器中。因此,我计划让每个服务都记录到其容器的标准输出,然后通过 Docker API 或日志容器传递给 Logentries。
问题:一个容器需要输出两条日志怎么处理?如何在不引入其他日志记录机制的情况下保持它们的清洁和分离?
场景: 我有一个 PHP 应用程序,它需要三个组件:Nginx、PHP-FPM 和我的代码。我可以将 Nginx 和 PHP-FPM 放在单独的 Docker 容器中,所以它们会有单独的日志,所以我们在那里很好。但是我的 PHP 必须与 Nginx 在同一个容器中才能提供服务,对吗?
当我的应用程序需要记录某些内容时(使用 Monolog),我可以发送它到容器的标准输出(例如,将日志文件设为 link 到 /dev/stdout),但是我无法将 Nginx 和我的应用程序的日志分开。
有办法吗?还是我看错了? 运行 Nginx + PHP in Docker 有更好的方法吗?
你检查过 Logentries Docker logging integration 了吗?
由于没有找到更好的解决方案,我最终 Laravel/Monolog 登录到已安装卷中的文件。 Logentries 代理然后从容器的主机收集日志。这允许我的容器尽可能保持干净,因为我没有安装 Supervisor 或日志记录代理,并且它允许 运行 容器以最小的努力访问日志。
记录到 stdout 被证明不是一个选项,因为 PHP-FPM 包装了子进程的每一行输出以使其难以解析,并且在 [=17= 的情况下] 日志,完全没用。 (参见 https://groups.google.com/forum/#!topic/highload-php-en/VXDN8-Ox9-M)
绝对可以将您的应用程序分成两个容器,这实际上是推荐的方法(记住:每个容器一个进程)。
只需像这样使用 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 日志记录工具分别管理日志。