web-dev-qa-db-ja.com

docker-composeログをファイルに保存する

ビルドサーバーで単体テストを実行しており、何かが失敗した場合に分析のためにログ結果をキャプチャしたいと思います。 docker-compose logsの出力をファイルにリダイレクトする方法、またはログファイル自体が実際に存在する場所を見つける方法をまだ見つけていません。

私は同等のものが欲しい:

docker-compose logs > logs.txt

編集-明確化:

私のすべてのdockerコンテナーは、docker-compose logsを手動で実行すると明らかになる有用なログを生成します。このプロセスのスクリプトを作成して、同じログをビルドサーバー上のアーティファクトであるファイルに保存します。基本的に、docker-compose logsの出力はファイルに保存されますが、docker-compose logsは終了しません。

37
Ryan

デフォルトでは、Dockerはjson-fileドライバーを使用してコンテナーログを記録します。ログの生のjson出力は次の場所にあります。

/var/lib/docker/containers/[container-id]/[container-id]-json.log

この場所を取得するには、次を実行します。

docker inspect --format='{{.LogPath}}' [container-id or container-name]

docker-compose logs [service-name]を実行すると、docker-composeは参照するサービス(コンテナ)にアタッチし、 LogPrinter オブジェクトは上記のファイルのコンテンツを出力しますが、読みやすい。

関連ドキュメント: https://docs.docker.com/compose/compose-file/#logging

43
Chris McKinnel

何を達成しようとしているのかわかりません。再現しようとしていますか

docker-compose logs > logs.txt

構成ファイル内に命令として?または、リダイレクトが出力全体を「キャッチ」しないという問題ですか?

後で、次のことができます。

docker-compose logs --no-color >& logs.txt

または

docker-compose logs --no-color |& tee logs.txt

ターミナルでログを確認し、同時にファイルにダンプします。

18
creack

後のリリースのdocker-compose 1.7.x +では修正されています。 https://github.com/docker/compose/issues/2227https://github.com/docker/compose/releases/tag/1.7. を参照

その前に、それを実現する別の方法があります。受け入れられた答えの解決策は、ホストファイルに直接アクセスすることです。これは、リモート/セキュリティの場合には適用できない場合があります。

以下では、docker-compose psコマンドからコンテナ名を取得し、docker logsコマンドをループさせることができます。

docker-compose ps | tail -n +3 | awk '{print $1}' | xargs -n1 docker logs
6
Larry Cai

docker-compose logsコマンドdoes終了(--follow設定を追加しない限り)。

ここで起こりそうな問題は、ログが非常に大きいため、ログのフォーマットと出力に時間がかかることです。読みたい行の数と読みたいコンテナの両方を指定することで出力を制限する場合、この問題を減らすことができます。

試してください:

docker-compose logs --no-color --tail=1000 CONTAINER_NAME > logs.txt

(必要に応じてテール番号を調整します。出力を簡素化するために「--no-color」を追加しましたが、必要ではありません。)

2

私が作成したソリューションは、いくつかの機能強化を加えたChris McKinnelの回答に基づいています。

Nginxコンテナーから最後の1MIOレコードをダンプする必要があり、docker-compose logs --tail 1000000 nginx > last1mio.logが遅すぎたため、出力は通常のnginxファイルとまったく同じではありませんでした。

これは私のために働く解決策です:

docker inspect --format='{{.LogPath}}' nginx-1 \
| xargs tail -n 1000000 \
| jq -r -j .log > last1mio.log 2>&1

ノート:

  • コンテナ名を知っている必要があります。私の場合はnginx-1-この定数を持つためにdocker-composeオプションcontainer_name:を使用します
  • 私は JQユーティリティ を使用してjsonを解析します。通常のオリジナルのnginxログファイルと同じ形式を取得するための特別なオプションがいくつかあります。

私の場合、nginxログの最後の1mio行のダンプにはcca 10秒かかります。

1
Robert Lujo