docker logs
コマンドは、Dockerコンテナのログを表示するために使用されます。以下では、docker logs
コマンドの基本的な使い方と利用可能なオプションについて解説します。
docker logs
コマンドの一般的な構文は以下の通りです。
docker logs [オプション] <コンテナ名またはID>
具体的な使用例として、コンテナ名がmy-container
の場合、以下のようにコマンドを実行します。
docker logs my-container
このコマンドは、my-container
コンテナのログを表示します。
docker logs
コマンドには、以下のオプションが利用可能です。
--details
: ログに提供する詳細情報を表示します。-f, --follow
: ログの末尾を追跡し、新しいログが追加されるたびに表示します。-n, --tail <数値>
: 直近の指定した数値のログ行を表示します。デフォルトはすべてのログ行を表示します。--tail
だから省略版は-t
かなって思ったら-n
なので注意。--since <日時>
: 指定した日時以降のログ行のみを表示します。日時はISO 8601形式(例: “2022-01-01T00:00:00Z”)で指定します。--until <日時>
: 指定した日時以前のログ行のみを表示します。日時はISO 8601形式で指定します。-t, --timestamps
: ログ行の前にタイムスタンプを表示します。省略版の-t
はこっちで、--tail
じゃないので注意。これらのオプションは、必要に応じて組み合わせて使用できます。以下に具体的な使用例を示します。
docker logs -f --timestamps my-container
docker logs --tail 10 my-container
docker logs --since "2022-01-01T00:00:00Z" my-container
docker logs --until "2022-01-01T00:00:00Z" my-container
grep
へのパイプはリダイレクトを併用するdocker logs
コマンドは、デフォルトでコンテナの標準エラー出力(stderr)に出力されるログを表示します。この仕様が、ログの出力結果をgrep
での抽出と食い合わせが悪いのです。
grep
へのパイプとdocker logs
grep
コマンドは、ご存知のとおりテキストのパターンマッチングを行うためのツール。何らかのコマンドとgrep
をパイプでつないだ場合、grep
コマンドは標準入力から受け取ったテキストを処理する。
ところが、docker logs
コマンドの出力を単純にパイプでつなげるだけだと、grep
コマンドの対象となりません。
たとえば、以下のようなコマンドを実行した場合、grep
コマンドはパイプで接続されているものの何の効果も発揮しません。
docker logs my-container | grep "error"
‘grep “error”‘と書いても効力を発揮しないということは、書いてないものと一緒です。
docker logs my-container
つまり、上記と同じ出力になる、ということですね。
こうなってしまうのは、パイプの出力先は標準出力で機能するものなのに、docker logs
の結果が標準エラー出力に書き込まれているためです。それなら、標準エラー出力に出力されている結果を、標準出力にリダイレクトしてやればいいわけです。
docker logs my-container 2>&1 | grep "error"
上記の2>&1
が、そのリダイレクトです。
|入出力 | 対応する値| |–|–| |標準入力|0| |標準出力|1| |標準エラー出力|2|
Linuxでは上記のように入出力が割り当てられており、標準出力に標準エラー出力をリダイレクトさせたい場合は2>&1
と書きます。2>
と書くことで、標準エラー出力をリダイレクトする、としているわけです。ちなみに、ここで&1
は何をしているかというと、標準出力と標準エラー出力の両方をまとめて標準出力にリダイレクトしています。
なお、ここで言っている数値は正確には「ファイル・ディスクリプター」という名前があります。ファイル・ディスクリプターとは、プログラムがアクセスするファイルや標準入出力などをOSが識別するために用いる識別子です。0から順番に整数の値が割り当てられています。