将Apache2日志写入stdout / stderr吗?


29

我正在docker容器中运行Apache2,并且不希望将任何内容写入磁盘,而是将日志写入stdout和stderr。我已经看到了几种不同的方法来执行此操作(Supervisord和stdout / stderrApache访问日志到stdout),但是这些看起来像是黑客。默认情况下没有办法吗?

需要明确的是,我不想拖尾日志,因为这将导致将内容写入容器中的磁盘。


您不是要方便地访问这些日志以进行故障排除/调试吗?为什么不直接将它们写入(r)syslog服务器呢?
HTTP500

@ HTTP500-它们被捕获在docker容器的外部。
马特

如果您使用:FROM php:5.6-apache,它已经包括stdout和stderr的日志。
Martlark

Answers:



25

安装apache2软件包后,如何将其放置在Dockerfile中?

RUN ln -sf /proc/self/fd/1 /var/log/apache2/access.log && \
    ln -sf /proc/self/fd/1 /var/log/apache2/error.log

假设这是日志的路径。它适用于Ubuntu 14.04,也适用于Ubuntu 16.04。

注意:如果你是肯定的符号链接/dev/stdout/proc/stderr在那里,那么你也可以使用这些。我更喜欢真实文件的路径,因为这可以保证存在。


在Ubuntu 16.04上也能很好地工作:)
OkieOth

1
该死的,这是一个巧妙的技巧!Apache尝试打开常规文件,但从自身角度通过符号链接重定向到其自己的stdout。
joonas.fi,2013年

1
只是想说谢谢...启用ssl后,官方的Apache httpd 2.4 docker容器无法写入日志。将这些行+ ssl_request_log添加到从httpd2.4提取的Dockerfile中。
j.con

3
您可以将/ proc / self / fd / 1缩写为/ dev / stdout。他们是完全一样的东西。
Chuck Adams

@ChuckAdams-它们是软链接,通常存在于其中,但不能保证生成它们时存在的图像。尤其是缩微图像。而内核将始终导出/ proc / self / fd / 1和
Matt

1

没有具体要求的答案,但是根据您的情况,也许更好的方法是根本不登录到stdout / stderr。只需将日志以JSON格式传递给cat。这将消除区分流的需要,因为json可能具有区分它们所需的数据。例如,以下内容。然后可以更轻松地将其摄取到类似Graylog的内容中

GlobalLog "| cat - " gelf
ErrorLog "| cat - " 

LogFormat "{ \"apache_log\": \"ACCESS\", \"app_name\": \"apache\",  \"Connection\": \"%{X-Forwarded-Proto}i:%{X-Forwarded-Port}i \", \"X-Forwarded-For\": \"%{X-Forwarded-For}i\",  \"version\": \"1.1\", \"vhost\": \"%V\", \"short_message\": \"%r\", \"timestamp\": %{%s}t, \"level\": 6, \"user_agent\": \"%{User-Agent}i\", \"source_ip\": \"%a\", \"duration_usec\": %D, \"duration_sec\": %T, \"request_size_byte\": %O, \"http_status\": %s, \"http_request_path\": \"%U\", \"http_request\": \"%U%q\", \"http_method\": \"%m\", \"http_referer\": \"%{Referer}i\", \"X-Powered-By\": \"%{X-Powered-By}i\" }" gelf

ErrorLogFormat "{ \"app_name\": \"apache\",  \"apache_log\": \"ERROR\", \"time\":\"%{%Y-%m-%d}tT%{%T}t.%{msec_frac}tZ\", \"function\" : \"[%-m:%l]\" , \"process\" : \" [pid %P:tid %T] \" , \"message\" : \"%M\" ,\ \"referer\"\ : \" %{Referer}i \" }"

还有一个gelf日志记录模块,因此,如果您愿意,也可以将流直接从apache流传输到graylog类型的服务器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.