docker logsコマンドの使い方(実例で解説)

Docker公式ロゴ3a
©2023 Docker Inc. All rights reserved

 本記事はDocker ver20.10.8の環境で確認しています。

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

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

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

 本記事の後半でコンテナに設定されているロギングドライバの確認方法を掲載しましたのでご利用ください。

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

フォーマット

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

主なオプション一覧

オプション概説
--detailsログ出力内容に追加情報を表示する
-f, -follow=true or falseログの情報を出力し続ける
--since=""指定した時点より後のログを表示する
--until=""指定した時点より前のログを表示する
-t, -timestamps=true or falseログにタイムスタンプを表示する
--tail=""ログの最後から指定した行数分表示する

コマンド例

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

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

 以下で実例をまじえたコマンドの使い方を解説していきたいと思います。

実例では、Ubuntuの公式イメージにより起動したコンテナ(testvm)を使用します。

コンテナは「docker run -dit --init --name testvm ubuntu」で起動します。

※「--rm」オプションを付けておりませんので、ご利用後はコンテナ削除をお忘れなく。

基本事項の解説

 冒頭でもふれましたが、docker logsコマンドは、コンテナの標準出力(STDOUT)及びエラー出力(STDERR)の内容を画面に出力します。

 出力された内容は、コンテナ毎に指定されたロギングドライバによってハンドリングされます。

 ロギングドライバがjson-fileかjournaldのときは、docker logsコマンドで出力された内容を確認することが可能です。

 LinuxなどのCUIでは、ログを出力する際にtailコマンドを多用されると思います。

 docker logsコマンドは、tailコマンドと似た動作をするオプションが用意されていますので、tailコマンドをご存知の方は活用しやすいのではないでしょうか。

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

 実際にコンテナのSTDOUTとSTDERRに何か情報を出力させて、その内容をdocker logsコマンドで確認してみたいと思います。

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

$ docker run -dit --init --name testvm ubuntu bash

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

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

$ docker logs testvm

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

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

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

 docker attachコマンドは、簡単に言いますと、コンテナの標準入出力及びエラー出力を、dockerホストと接続させるためのコマンドです。

 出力されたコマンドプロンプトは、コンテナ内のbashが出力したものを、docker attachコマンドによって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コマンドでコンテナの出力メッセージを確認することをおすすめします。

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

 この使い方は、tailコマンドの「-f」と同じ表示の仕方になります。

 オプションを指定せずにdocker logsコマンドを実行した場合は、格納されているログが全て出力されます。

 全て出力し終わりますと、docker logsコマンドの処理は終了します。

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

 以下の内容は、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コマンドでも可能です。

 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

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

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

 最後に、コンテナtestvmがdocker logsコマンドでログ情報が出力可能な環境であることを確認する方法を解説します。

 確認にはdocker inspectコマンドを使用します。

$ docker inspect testvm

 実行結果の中の「LogConfig:」の値を確認してください。

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

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

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

 デフォルトは「json-file」です。

おわりに

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

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

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

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

コメント