web-dev-qa-db-ja.com

DockerのApache:「access.log」をどうやって使うのですか?

私はDockerとrichtを使い始めたばかりで、最初のドッキングされたApache 2/PHP=環境をセットアップする方法を理解しようとしています。今までは、完全なLinux VMを使用しています/ var/log/Apache2に書き込まれるログファイルを使用し、「logrotate」を使用して毎日新しいファイルに移動しました。

ログファイルは主に、即時のエラー検出(つまり、サーバーにログオンし、現在のaccess.logおよびerror.logファイルを開くためにより少ない量を使用)およびfail2banに使用されました。

私が正しい場合、それはDocker環境では実用的ではありません-主にコンテナーにログインしてログを見ることはできないためです。また、コンテナが削除されるとログは失われます。

それで、そのような状況でaccess.log/error.logを使用/エミュレート/置換する最も一般的な方法は何ですか?本番環境と開発環境の両方に共通するソリューションは何ですか?

これまでの私の考えには、NFS共有の使用(低速であり、注意しないとファイル名の衝突が発生する可能性があります)、および logstash (これが、小規模なサイトや開発環境でさえも実用的で実用的かどうかわからない?)しかし、賢い人々がより良い解決策を考え出したと私は確信していますか?

それが違いをもたらすかどうかはわかりませんが、現在私はDockerイメージを php:5.6-Apache に基づいています。

19
BlaM

docker exec -it <your container name> /bin/bashコマンドを使用してコンテナーにアクセスし、通常のジョブを実行できます。または、/bin/bashをコマンドまたはコマンドのスクリプト.shに変更して実行することもできます。

コンテナからファイルを取得するには、docker cp <container name:/path/to/file> </your local machine/path/>を使用します

そして、毎日のジョブでは、cronを使用してこれらのコマンドをcronjobできます。頻繁に使用するdockerコマンドにエイリアスを付けることを強くお勧めします。数個のキーでDockerを楽しく使えるように。

docker logs <container name/id>コマンドは、Dockerイメージの実行からのログを表示するためのものです。 stdoutへのリダイレクト出力を示します。

14
Fony Lew

アクセスとエラーログをstderrとstdoutに書き込むのはどうですか?

https://mail-archives.Apache.org/mod_mbox/httpd-users/201508.mbox/%3CCABx2=D-wdd8FYLkHMqiNOKmOaNYb-tAOB-AsSEf2p=ctd6sMdg@mail.gmail.com%3E

https://Gist.github.com/afolarin/a2ac14231d9079920864

RUN ln -sf/dev/stdout /var/log/nginx/access.log

RUN ln -sf/dev/stderr /var/log/nginx/error.log

[〜#〜] elk [〜#〜] を使用した集中ロギングにより、より積極的な監視が可能になります。しかし、あなたはすでにそれを自分で考えました。

6
JayMcTee

Apache構成ファイルに次を追加できます。
CustomLog/dev/stdout
ErrorLog/dev/stderr

ログを表示するには、次のコマンドを使用します。
docker logs container_id

3
S.Bao
root@my_docker:~ # ls -l /var/log/Apache2/
total 0
lrwxrwxrwx 1 root root 11 Jul 17 04:55 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jul 17 04:55 error.log -> /dev/stderr
lrwxrwxrwx 1 root root 11 Jul 17 04:55 other_vhosts_access.log -> /dev/stdout
root@my_docker:~ #

私が選択したdockerイメージは、すべての* .logファイルを/ dev/stdoutおよび/ dev/stderrにリンクしたため、それらを読み取ることができませんでした。

ファイルを削除してApacheを再起動すると、Dockerの/ var/log /からログを取得できます。

docker-compose exec Apache bash -c "tail -f /var/log/Apache2/*.log"
1
Ohad Cohen

質問があったときにこの機能は存在しなかったかもしれませんが、runの-v引数を使用すると、ホスト上のディレクトリをコンテナー内のディレクトリにマウントできます。

docker run -v [Host_dir]:[container_dir]

このように、コンテナーが削除されてもログ(またはその他の)ファイルは存続し、Apacheがコンテナーではなくホストにインストールされているかのようにファイルにアクセスできます。

または、変更されたログファイルを中央の場所にプッシュすることもできます。 Kibanaスタックはこれを達成するためにfilebeatを使用しますが、スタックの残りを気にしない場合は、filebeatを個別に実行できるはずです。

1
Erik Lievaart

これまでのところ、「 docker logs 」が何度か言及されています。

私は完全なDocker newbなので、問題の解決策になるかもしれませんが、これまでのところ、そのコマンドの背後にある概念を完全には理解していません。

Dockerはすべてのstdout出力を/ var/lib/docker/containers /の JSONファイル に保持しているようで、logsコマンドでアクセスできるようにしています。

これまでのところ、実際に出力を使用する方法がわかりません。

1
BlaM