docker logsコマンドの使い方(実例付)CE対応


 docker logsコマンドの使い方の紹介ページです。Docker CE ver17.12.1に対応しております。

 このコマンドは、コンテナの標準出力及びエラー出力の内容を、コマンドの実行結果として出力することが可能です。

 コンテナの標準出力には、通常、コンテナ内のPID(プロセスID)が1番に割り当てられているプロセスの出力がアサインされます。

 本記事では、コンテナの標準出力に、自由に出力情報を送れるように、シェル(bash)をプロセス1番として起動します。このようにしますと、そのシェルで実行された内容が標準出力に出力され、その内容がdocker logsの出力内容として表示されることになります。

 尚、docker logsでログ情報が出力可能な条件としまして、コンテナがjson-file と journald ロギング・ドライバを使用する場合のみである旨が、Docker公式サイト内のdocker logsの説明ページに記載されてました。

 それでは以下で詳細に解説いたします。

 

docker logsコマンドのフォーマットとオプション

フォーマット

docker logs [オプション] 対象コンテナ

 

主なオプション一覧

--details
ログ出力内容に追加情報を表示する

-f, -follow=true or false
ログの情報を出力し続ける

--since=""
指定した時点より後のログを表示する

--until="" NEW
指定した時点より前のログを表示する

-t, -timestamps=true or false
ログにタイムスタンプを表示する

--tail=""
ログの最後から指定した行数分表示する

■ 本記事の目次に戻る ■

docker logsコマンドの主な使い方

 以下の実例は、CentOSの公式イメージにより起動したコンテナ(testvm)を使用します。コンテナは「docker run -dit --name testvm centos bash」で起動します。

 

ログ情報が出力可能なコンテナであることを確認する

 まず初めに、コンテナtestvmがdocker logsコマンドでログ情報が出力可能な環境であることを確認します。確認にはdocker inspectコマンドを使用します。

$ docker inspect testvm

 実行結果の中の「Log Config:」の値を確認します。

 (以上略)
 "LogConfig": {
         "Type": "json-file",
         "Config": {}
  (以下略)

 ここの値が「json-file」若しくは「journald」であることが、docker logsコマンドを利用可能な条件となっております。

 私の環境は、ロギングドライバーとして「json-file」を使用してますので、docker logsコマンドを利用可能であることが確認できました。

 少し余談ですが。

 ロギングドライバーの設定は、コンテナの生成時もしくは起動時に「--log-opt」で指定することが可能です。

 コンテナの生成時もしくは起動時に指定しなかった場合は、dockerデーモンの起動時オプションにて指定した値が使われるのですが、私の環境(CE Ver17.12.1)では、dockerデーモンのオプション指定は行ってませんが、コンテナのLog ConfigのTypeの値は「json-file」でした。

 よって、デフォルトは「json-file」と思われます。

■ 本記事の目次に戻る ■

コンテナのログ情報を出力する

 docker logsコマンドでログ出力の確認を行うテスト用のコンテナを起動します。

$ docker run -dit --name testvm centos bash

 このコンテナは、プロセスIDが1番のプロセスとしてbashが起動されてますので、bashの標準出力及び標準エラー出力の内容がコンテナのログとして出力されます。

 ここでdocker logsコマンドを実行してみます。

$ docker logs testvm

 なにも出力されません。コンテナが起動された直後ですので、bashはなにも出力してません。よって、ログにはなにも記録されておらず、docker logsコマンドを実行してもなにも出力されません。

 ここで、コンテナ内のbashプロセスにコマンドを実行させるために、コンテナtestvmにdocker attachコマンドで接続してみます。

$ docker attach testvm
[root@6585138fb5ee /]#

 docker attachコマンドの詳細は本記事では省略させていただきますが、簡単に言いますと、コンテナの標準入出力及びエラー出力を、dockerホストと接続させるためのコマンドです。

 出力されたコマンドプロンプトは、コンテナ内のbashが出力したものが、docker attachコマンドを実行することによってDockerホスト上に出力されたものです。

 よって、このプロンプトに入力したコマンドは、コンテナ内のbashで実行され、その出力はDockerホスト上に出力されます。

 では、このプロンプトで試しに「ls -l /var/log」コマンドを実行してみます。

[root@6585138fb5ee /]# ls -l /var/log
total 0
drwxr-xr-x 2 root root 155 Nov 2 12:47 anaconda
-rw------- 1 root utmp 0 Nov 2 12:47 btmp
-rw-rw-r-- 1 root utmp 0 Nov 2 12:47 wtmp
[root@6585138fb5ee /]#

 コンテナ内の/var/logディレクトリの内容が出力されました。

 もう一つ、わざとエラーになるような適当な文字列も実行しておきます。

[root@6585138fb5ee /]# kshgacmhah
bash: kshgacmhah: command not found

 ここで、dockerホストにてdocker logsコマンドを実行するために、コンテナtestvmとの接続を解除します。

 「Ctrl+p」と「Ctrl+q」を順に押すことで解除されます。

 では、docker logsコマンドを実行してみます。

$ docker logs testvm

 先ほどはなにも出力されませんでしたが、今度は以下のように、先ほどコンテナ内のbashで実行した内容が出力されました。

[root@6585138fb5ee /]# ls -l /var/log
total 0
drwxr-xr-x 2 root root 155 Nov 2 12:47 anaconda
-rw------- 1 root utmp 0 Nov 2 12:47 btmp
-rw-rw-r-- 1 root utmp 0 Nov 2 12:47 wtmp
[root@6585138fb5ee /]# kshgacmhah
bash: kshgacmhah: command not found
[root@6585138fb5ee /]#

 この内容は、コンテナtestvm内のbashの標準出力及びエラー出力から出力された内容です。ちゃんとログに記録されていることが解ると思います。(ちなみに標準エラー出力の確認を行うためにわざとエラーを出力させてみました)

 標準出力や標準エラー出力には、しばしば重大なメッセージが出力されることがあります。dockerのコンテナでは、それらのメッセージをコンテナのログに出力する場合がありますので、トラブルシューティングの際には、docker logsコマンドでコンテナの出力メッセージを確認することをおすすめします。

■ 本記事の目次に戻る ■

ログを出力し続けるオプションの使い方

 オプション無しでdocker logsコマンドを実行した場合は、格納されているログが全量出力されます。そして全量出力し終わりますと、docker logsコマンドの処理は終了します。

 docker logsコマンドに「-f」若しくは「--follow=true」オプションを付けて実行した場合、ログを全量出力し終わっても、コマンドの処理は終了せず、新規にログが発生すると、リアルタイムにそのログを出力します。

 Linuxのtailコマンドをご存知の方は、「-f」オプションと同じ使い方になります。

 以下の内容は、terminalを2つ使用して行います。1つはコンテナtestvmにdocker attachコマンドで接続するためのterminalで、もう1つはdocker logsコマンドを実行するterminalです。

 1つ目のterminalで以下のコマンドを実行します。

$ docker attach testvm

 もう1つのterminalで以下のコマンドを実行します。

$ docker logs -f testvm

 「-f」を付けて実行しますと、ログは全量出力されても、コマンドは終了しません。

 この状態で、1つ目のterminal(コンテナにattachした方)のプロンプトで、以下のようにpsコマンドを実行してみます。

[root@675dce6206fa /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:33 ? 00:00:00 bash
root 14 1 0 14:53 ? 00:00:00 ps -ef

 すると、もう1つのterminal(docker logsコマンドを実行した方)に、同時に同じ内容が出力されます。

[root@675dce6206fa /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:33 ? 00:00:00 bash
root 14 1 0 14:53 ? 00:00:00 ps -ef

 対象のコンテナから出力があった場合、それを出力し続けるようになります。

 あるコンテナの管理用terminalで、コンテナのログをリアルタイムに監視したい場合などに便利です。

 ログの出力を終わらせる場合は「Ctrl+c」を押してください。

■ 本記事の目次に戻る ■

ログ出力内容にタイムスタンプを付与する

 docker logsコマンドに「-t」もしくは「--timestamps=true」を付けて実行します。

$ docker logs -t testvm

 このオプションを付けて実行した場合、ログは、例えば、以下のように出力されます。

2015-12-30T14:53:46.948951220Z UID PID PPID C STIME TTY TIME CMD
2015-12-30T14:53:46.948980320Z root 1 0 0 14:33 ? 00:00:00 bash
2015-12-30T14:53:46.948987220Z root 14 1 0 14:53 ? 00:00:00 ps -ef
2015-12-30T15:08:48.120482709Z [root@675dce6206fa /]# exit
2015-12-30T15:08:48.120510309Z exit

 各行に、ログが出力された時刻のタイムスタンプが追加されてます。

 尚、このタイムスタンプは、コンテナ内で指定したタイムゾーンの時刻で出力されます。今回の検証で使用したコンテナのタイムゾーンは無指定ですので、デフォルトのGMTの時刻で出力されてます。

 タイムスタンプは、日付と時刻の情報が記録されてますが、時刻はナノ秒まで記録されてます。プログラミングのデバッグを行う場合などはうれしい情報ではないでしょうか。

■ 本記事の目次に戻る ■

指定した時点より後のログを出力する

 「--since」オプションは、指定した日時より後、もしくは指定した時間前の時点より後のログを表示させることが可能です。

 以下のコマンドは、指定した日時より後のログを表示する場合です。

$ docker logs --since "2015-12-30T15:08:00Z" -t testvm

 このコマンドは、2015年12月30日15時8分より後に出力されたログを出力します。

 指定した日時より後のログが出力されていることが確認しやすいように、「-t」も付与して実行してます。

 日時の指定は上記のRFC3339のフォーマットや、UNIX timestamp(1970/1/1からの経過時間(秒))などが使用可能です。

 次に、指定した期間のログを表示する場合です。

$ docker logs --since "1h30m" -t testvm

 このコマンドを実行しますと、指定した時間前(1時間30分前)の時点より後のログが出力されます。

■ 本記事の目次に戻る ■

指定した時点より前のログを出力する 追加

 「--until」オプションは、指定した日時より前、もしくは指定した時間前の時点より前のログを表示させることが可能です。

 以下のコマンドは、指定した日時より前のログを表示する場合です。

$ docker logs --until "2015-12-30T15:08:00Z" -t testvm

 このコマンドは、2015年12月30日15時8分より前に出力されたログを出力します。

 指定した日時より前のログが出力されていることが確認しやすいように、「-t」も付与して実行してます。

 日時の指定は上記のRFC3339のフォーマットや、UNIX timestamp(1970/1/1からの経過時間(秒))などが使用可能です。

 次に、指定した期間のログを表示する場合です。

$ docker logs --until "1h30m" -t testvm

 このコマンドを実行しますと、指定した時間前(1時間30分前)の時点より前のログが出力されます。

■ 本記事の目次に戻る ■

出力する行数を指定する

 「--tail」オプションは、ログの最後の出力(最新の出力行)から、指定した行数のログをさかのぼって出力することが出来ます。

 以下のコマンドは、コンテナtestvmのログの最後の出力から10行分出力されます。

$ docker logs --tail=10 testvm

 UNIXのtailコマンドをご存知の方はお馴染みだと思います。

 

  以上でdocker logsコマンドの紹介を終わります。

 ご指摘、ご要望などが御座いましたらコメントいただけるとうれしいです。

 他のDockerコマンドの実例付紹介記事は、本サイト内の別記事「Dockerのコマンドの一覧(ver1.12対応版)(オリジナルな実例付き)」をご参照ください。

 ご訪問ありがとうございました!


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です