Apache2ログをstdout / stderrに書き込みますか?


29

DockerコンテナでApache2を実行していますが、ディスクに何も書き込まず、ログをstdoutおよびstderrに書き込みたいと考えています。私はこれを行うためのいくつかの異なる方法を見ました(Supervisordおよびstdout / stderrApacheアクセスログからstdout)が、これらはハッキングのように見えます。デフォルトでこれを行う方法はありませんか?

明確にするために、ログを末尾にしたくないのは、コンテナ内のディスクに物事が書き込まれることになるからです。


トラブルシューティング/デバッグの目的で、これらのログに簡単にアクセスできるようにしたくないですか?代わりに(r)syslogサーバーにそれらを書き込むだけではどうですか?
HTTP500 16

@ HTTP500-Dockerコンテナの外側でキャプチャされます。
マット

FROM php:5.6-apacheを使用する場合、これにはすでにstdoutおよびstderrへのログが含まれています。
マートラーク

回答:



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 16

1
感謝したいだけです...公式のApache httpd 2.4 Dockerコンテナは、sslを有効にした後にログの書き込みに失敗します。これらの行とssl_request_logをhttpd2.4からプルするDockerfileに追加すると機能しました。
j.con

3
/ proc / self / fd / 1を/ dev / stdoutに短縮できます。それらはまったく同じものです。
チャックアダムス

@ChuckAdams-これらはソフトリンクであり、通常は存在しますが、存在するイメージを構築する際の保証はありません。特にマイクロ画像を切り詰めます。一方、カーネルは常に/ proc / self / fd / 1&2をエクスポートします
マット

1

具体的には、答えは求められていませんが、シナリオによっては、stdout / stderrにまったくログインしない方が良いかもしれません。ログをJSON形式でcatにパイプするだけです。これにより、jsonがストリームを区別するために必要なデータを持つことができるため、ストリームを区別する必要がなくなります。たとえば、次の行に沿ったもの。これは、グレーログのようなものにはるかに簡単に摂取できます

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からグレイログタイプのサーバーに直接ストリーミングすることもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.