頑張らないために頑張る

ゆるく頑張ります

docker logsコマンドの基本

Posted at — Mar 6, 2024

概要

docker logsコマンドは、Dockerコンテナのログを表示するために使用されます。以下では、docker logsコマンドの基本的な使い方と利用可能なオプションについて解説します。

基本的な使い方

docker logsコマンドの一般的な構文は以下の通りです。

docker logs [オプション] <コンテナ名またはID>

具体的な使用例として、コンテナ名がmy-containerの場合、以下のようにコマンドを実行します。

docker logs my-container

このコマンドは、my-containerコンテナのログを表示します。

利用可能なオプション

docker logsコマンドには、以下のオプションが利用可能です。

これらのオプションは、必要に応じて組み合わせて使用できます。以下に具体的な使用例を示します。

ログの追跡とタイムスタンプの表示

docker logs -f --timestamps my-container

直近の10行のログの表示

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から順番に整数の値が割り当てられています。

参考

  1. View container logs
  2. how to grep docker log
  3. Finding a string in docker logs of container
  4. How to Redirect stderr to stdout in Bash
  5. bash: 標準出力、標準エラー出力をファイル、画面それぞれに出力する方法
comments powered by Disqus