分析するために、docker containerのすべてのログを単一のログファイルにリダイレクトしたいです。私は試した
docker logs container > /tmp/stdout.log 2>/tmp/stderr.log
しかし、これは2つの異なるファイルにログインを与えます。私はすでに試した
docker logs container > /tmp/stdout.log
しかし、うまくいきませんでした。
ログをリダイレクトする必要はありません。
Dockerはデフォルトでログを1つのログファイルに保存します。ログファイルのパスを確認するには、次のコマンドを実行します。
docker inspect --format='{{.LogPath}}' containername
/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
そのログファイルを開いて分析します。
あなたがログをリダイレクトするならば、あなたはリダイレクトの前にログを得るだけでしょう。ライブログを見ることはできません。
編集:
ライブログを見るには、以下のコマンドを実行します。
tail -f `docker inspect --format='{{.LogPath}}' containername`
注:
このログファイル/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
は、ログがない場合にdockerがログを生成した場合にのみ作成され、このファイルは存在しません。 docker logs containername
コマンドを実行しても何も返されない場合も、よく似ています。そのシナリオでは、このファイルは利用できません。
このオプションはどうですか?
docker logs containername >& logs/myFile.log
質問で要求されたログはリダイレクトされませんが、特定のファイルに一度コピーされます。
docker logs -f <yourContainer> &> your.log &
説明:
-f
(すなわち、--follow
):既存のログをすべて書き込み、次に来るすべてのログを続けます(続く)。&>
は標準出力と標準エラーの両方をリダイレクトします。&
で実行したいでしょう。> output.log 2> error.log
を使う代わりに)&>
で出力とstderrを分けることができます。複数のコンテナがあり、ログを単一のファイルに集約したいと仮定すると、fluentdのようなログアグリゲータを使用する必要があります。 fluentdはdockerコンテナのロギングドライバとしてサポートされています。
そのため、docker-composeでは、ロギングドライバを定義する必要があります。
service1:
image: webapp:0.0.1
logging:
driver: "fluentd"
options:
tag: service1
service2:
image: myapp:0.0.1
logging:
driver: "fluentd"
options:
tag: service2
2番目のステップは、service 1とservice 2の両方のログを提供するようにfluentd confを更新することです。
<match service1>
@type copy
<store>
@type file
path /fluentd/log/service/service.*.log
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%z
</store>
</match>
<match service2>
@type copy
<store>
@type file
path /fluentd/log/service/service.*.log
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%
</store>
</match>
この設定では、ログをこのパスの単一ファイルに書き込むように要求しています/fluentd/log/service/service.*.log
そして3番目のステップは、カスタマイズされたfluentdを実行してログをファイルに書き出すことです。
ここにステップバイステップの説明のための リンクがあります
ビット長ですが、ログファイルのパスなどをより正確に制御できるため、Docker Swarmでもうまく機能します。
標準出力と標準エラーの両方をdockerコンテナから単一のログファイルにキャプチャするには、次のコマンドを実行します。
docker logs container > container.log 2>&1
Windowsで作業し、PowerShell(私のような)を使用している場合、次の行を使用してstdout
およびstderr
をキャプチャできます。
docker logs <containerId> | Out-File 'C:/dev/mylog.txt'
私はそれが誰かを助けることを願っています!
指定されたディレクトリにすべてのコンテナログをコピーするためのbashスクリプト
#!/usr/bin/env bash
TARGET_DIR=~/logs/docker_logs
mkdir -p "$TARGET_DIR"
for name in `Sudo docker ps --format '{{.Names}}'`;
do
path=$(Sudo docker inspect --format='{{.LogPath}}' $name)
Sudo cp -rf "$path" "$TARGET_DIR"/$name.log
done
Dockerはstdoutとstderrを統合しているので、ログ出力を他のシェルストリームと同じように扱うことができます。現在のログをファイルにリダイレクトするには、リダイレクト演算子を使用します。
$ docker logs test_container > output.log
docker logs -f test_container > output.log
出力をstderrおよびstdoutに送信する代わりに、アプリケーションの出力をファイルにリダイレクトし、そのファイルをコンテナの外部にある永続的なストレージにマップします。
$ docker logs test_container> /tmp/output.log
Dockerはコマンドラインでの相対パスを受け入れないため、別のディレクトリを使用したい場合は、完全パスを使用する必要があります。