web-dev-qa-db-ja.com

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

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

明確にするために、ログをテールにしたくありません。これは、コンテナー内のディスクに書き込まれることになるためです。

31
aronchick
  ErrorLog /dev/stderr
  TransferLog /dev/stdout

私のためにubuntuとcentosで動作します

31
Oskarowski

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が存在する場合は、それらも使用できます。これが存在することが保証されているので、実際のファイルへのパスを選択します。

30
Matt

具体的には求められた答えではありませんが、シナリオによっては、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からgraylogタイプのサーバーに直接ストリーミングすることもできます。

1
krad