我在docker容器中运行Apache2并且想要什么都不写入磁盘,将日志写入stdout和stderr。我已经看到了几种不同的方法(Supervisord和stdout / stderr,Apache访问日志到stdout),但这些看起来像黑客。默认情况下没有办法做到这一点吗?
要清楚,我不想拖尾日志,因为这会导致事物被写入容器中的磁盘。
"官方"检查到Docker Hub(https://hub.docker.com/_/httpd/)的版本仍然写入磁盘。
此外,在尝试滚动日志时,我需要做些什么来阻止Apache失败?
另一件事 - 理想情况下,我真的很想在没有其他插件的情况下这样做。 nginx可以做到这一点。
答案 0 :(得分:5)
根据apache邮件列表,您可以直接写入/ dev / stdio(在类似Unix的系统上),因为它只是一个普通的ol'文件句柄。简单!粘贴...
最有效的答案取决于您的操作系统。如果你是 在类似UNIX的系统上提供/ dev / stdout和/ dev / stderr(或 或许/ dev / fd / 1和/ dev / fd / 2)然后使用那些文件名。如果说 不是选项使用管道输出功能。例如,来自我的 配置:
CustomLog" | / usr / sbin / rotatelogs -c -f -l -L /private/var/log/apache2/test-access.log /private/var/log/apache2/test-access.log.%Y-%m-%d 86400" krader_custom ErrorLog" | / usr / sbin / rotatelogs -c -f -l -L /private/var/log/apache2/test-error.log /private/var/log/apache2/test-error.log.%Y-%m-%d 86400"
显然,您想要替换另一个程序 上面示例中的/ usr / sbin / rotatelogs将数据写入到哪里 你希望它去。
答案 1 :(得分:1)
您可以直接将ErrorLog发送到syslog,并且可以将任何CustomLog(访问日志)发送到从stdin读取的任何可执行文件。有日志聚合工具,或者您可以再次使用syslog w /例如的/ usr /斌/记录器。
答案 2 :(得分:1)
您可以尝试使用dockerize
工具。有了它,您可以包装httpd-foreground
命令并将其日志文件重定向到stdout / stderr(不完全知道httpd日志文件路径,只需根据您的需要调整它们):
CMD ["dockerize", "-stdout", "/var/log/httpd.log", "-stderr", "/var/log/httpd.err", "httpd-foreground"]
除此之外,您可以通过指定 syslog log driver来获取容器stdout / stderr,并将它们重定向到docker主机上的/var/log/syslog
日志文件:< / p>
docker run -d --log-driver=syslog ...
答案 3 :(得分:1)
我调整了配置,从httpd的Dockerfile配方开始,他们使用sed调整配置,按如下方式更改ErrorLog和CustomLog:
sed -ri ' \
s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \
s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \
' /usr/local/apache2/conf/httpd.conf \
请参阅https://github.com/docker-library/httpd/blob/master/2.4/Dockerfile(在文件末尾)
答案 4 :(得分:0)
我知道这是一个老问题,但我今天有这个需要。
在 Alpine 3.6 上,httpd.conf
中的以下说明正在运行:
Errorlog /dev/stderr
Transferlog /dev/stdout
我以这种方式将它们添加到我的容器中:
FROM alpine:3.6
RUN apk --update add apache2
RUN sed -i -r 's@Errorlog .*@Errorlog /dev/stderr@i' /etc/apache2/httpd.conf
RUN echo "Transferlog /dev/stdout" >> /etc/apache2/httpd.conf
...