1

在创建 Docker 容器时,要同时拥有apache2 error.log并通过docker logs -f <my_container>我使用一个容器,该容器运行supervisor作为入口点,并具有以下配置:

[supervisord]
nodaemon = true
environment = PLACEHOLDER=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:apache]
command=apache2ctl -DFOREGROUND
autostart=true
autorestart=true
startretries=1
startsecs=1
stderr_logfile=/var/log/apache2/error.log
stdout_logfile=/var/log/apache2/access.log
user=root
killasgroup=true
stopasgroup=true

[program:apache2-error]
command= tail -f /var/log/apache2/error.log
autostart = true
autorestart = true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:apache2-access]
command= tail -f /var/log/apache2/access.log
autostart = true
autorestart = true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

这工作正常,但我不明白为什么如果我[program:apache]用这个替换会话这不起作用:

[program:apache]
command=apache2ctl -DFOREGROUND
autostart=true
autorestart=true
startretries=1
startsecs=1
user=root
killasgroup=true
stopasgroup=true

也就是说:如果没有明确设置stderrstdout日志文件,该docker logs -f <my_container>命令不起作用,但在容器内tail -f /var/logs/apache2/access.log并且tail -f /var/logs/apache2/error.log工作正常。

有人可以向我解释为什么supervisor并且docker logs -f <my_container>由于这种配置更改而有两种不同的作品吗?

谢谢

4

1 回答 1

1

主管可以“看到” apache2 的标准输出并将其写入您使用stdout_file指定的文件中。问题是 apache2 不会将其访问日志写入标准输出,而是将其写入 /var/log/apache2 中的文件。

因此,您在中看到的docker logs -f是主管对您提供的文件进行的拖尾操作,主管正在将stdout_file其转发给stdout您在[supervosord].

因此,当您从supervisor中删除apache2日志文件配置时,没有这样的转发;和 apache2 继续写入与以前相同的文件。

因此,您需要做的是告诉 Apache 将其访问日志写入 /dev/stdout 而不是磁盘中的文件。您可以在 Apache 虚拟主机配置中执行此操作。

同样的事情stderr

于 2017-06-02T12:34:54.930 回答