web-dev-qa-db-ja.com

dockerログを単独のファイルにリダイレクトをする方法

分析するために、docker containerのすべてのログを単一のログファイルにリダイレクトしたいです。私は試した

docker logs container > /tmp/stdout.log 2>/tmp/stderr.log

しかし、これは2つの異なるファイルにログインを与えます。私はすでに試した

docker logs container > /tmp/stdout.log

しかし、うまくいきませんでした。

65
KETAN PATIL

ログをリダイレクトする必要はありません。

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コマンドを実行しても何も返されない場合も、よく似ています。そのシナリオでは、このファイルは利用できません。

87
pl_rock

このオプションはどうですか?

docker logs containername >& logs/myFile.log

質問で要求されたログはリダイレクトされませんが、特定のファイルに一度コピーされます。

88
Eddy Hernandez

docker logs -f <yourContainer> &> your.log &

説明:

  • -f(すなわち、--follow):既存のログをすべて書き込み、次に来るすべてのログを続けます(続く)。
  • &>は標準出力と標準エラーの両方をリダイレクトします。
  • おそらくそのメソッドをバックグラウンドで、つまり&で実行したいでしょう。
  • > output.log 2> error.logを使う代わりに)&>で出力とstderrを分けることができます。
16
juanmirocks

複数のコンテナがあり、ログを単一のファイルに集約したいと仮定すると、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でもうまく機能します。

4
Abhishek Galoda

標準出力と標準エラーの両方をdockerコンテナから単一のログファイルにキャプチャするには、次のコマンドを実行します。

docker logs container > container.log 2>&1
2
Jean Velloen

Windowsで作業し、PowerShell(私のような)を使用している場合、次の行を使用してstdoutおよびstderrをキャプチャできます。

 docker logs <containerId> | Out-File 'C:/dev/mylog.txt'

私はそれが誰かを助けることを願っています!

1
mirind4

指定されたディレクトリにすべてのコンテナログをコピーするための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
0
Mugen

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はコマンドラインでの相対パスを受け入れないため、別のディレクトリを使用したい場合は、完全パスを使用する必要があります。

0
Anish Varghese