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-containerdocker logs --tail 10 my-containerdocker logs --since "2022-01-01T00:00:00Z" my-containerdocker logs --until "2022-01-01T00:00:00Z" my-containergrepへのパイプはリダイレクトを併用するdocker logsコマンドは、デフォルトでコンテナの標準エラー出力(stderr)に出力されるログを表示します。この仕様が、ログの出力結果をgrepでの抽出と食い合わせが悪いのです。
grepへのパイプとdocker logsgrepコマンドは、ご存知のとおりテキストのパターンマッチングを行うためのツール。何らかのコマンドと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から順番に整数の値が割り当てられています。