Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
適用先 openSUSE Leap 15.6

11 journalctl : systemd ジャーナルへの問い合わせコマンド Edit source

systemd には独自のログ記録機能として、 ジャーナル と呼ばれる機能が用意されています。これにより、 syslog ベースのサービスを動作させる必要はなくなり、全てのイベントがジャーナルに書き込まれるようになっています。

ジャーナルそれ自身は systemd が管理するシステムサービスで、正確には systemd-journald.service という名称です。カーネルやユーザスペース、標準入力やシステムサービスのエラーなどから、様々なログ記録情報を収集し、構造化され順序番号の付いたジャーナルを管理して、データを記録し保存することができます。 systemd-journald サービスは既定で有効化されています:

> sudo systemctl status systemd-journald
systemd-journald.service - Journal Service
   Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static)
   Active: active (running) since Mon 2014-05-26 08:36:59 EDT; 3 days ago
     Docs: man:systemd-journald.service(8)
           man:journald.conf(5)
 Main PID: 413 (systemd-journal)
   Status: "Processing requests..."
   CGroup: /system.slice/systemd-journald.service
           └─413 /usr/lib/systemd/systemd-journald
[...]

11.1 ジャーナルの恒久化 Edit source

ジャーナルは既定では /run/log/journal/ 内にデータを保存します。ただし、 /run/ ディレクトリはメモリ内にのみ保持されるディレクトリであるため、システムを再起動するとログデータが失われてしまいます。ログデータを恒久的に保存するには、 /var/log/journal/ を作成して適切な所有権とアクセス許可を設定し、 systemd-journald に対してデータを保存するように設定する必要があります。具体的には下記のコマンドを実行します:

> sudo  mkdir /var/log/journal
> sudo  systemd-tmpfiles --create --prefix=/var/log/journal
> sudo  journalctl --flush

上記を実行することにより、 /run/log/journal/ 内に保存される全てのログデータが /var/log/journal/ に書き込まれるようになります。

11.2 journalctl での便利なスイッチ Edit source

本章では、既定の journalctl の動作を拡張するにあたって、便利なオプション類をいくつか紹介しています。全てのスイッチについての説明をご希望の場合は、 journalctl のマニュアルページ (man 1 journalctl) をご覧ください。

ヒント
ヒント: 特定の実行ファイルに関連するメッセージ

特定の実行ファイルに関連する全てのジャーナルメッセージを表示するには、実行ファイルのフルパスを指定します:

> sudo journalctl /usr/lib/systemd/systemd
-f

直近のジャーナルメッセージのみを表示し、以後ジャーナルに更新があるたびに項目を随時表示します。

ジャーナルメッセージを表示して末尾に移動します。ページャを介して最新の項目から閲覧できるようになります。

-r

ジャーナルのメッセージを逆順で表示します。最新の項目が最初に表示されるようになります。

-k

カーネルメッセージのみを表示します。これは項目ベースのフィルタで、 _TRANSPORT=kernel と同じ意味になります (詳しくは 11.3.3項 「項目をベースにしたフィルタ」 をお読みください) 。

-u

指定した systemd ユニットに対するメッセージのみを表示します。これは項目ベースのフィルタで、 _SYSTEMD_UNIT=ユニット名 と同じ意味になります (詳しくは 11.3.3項 「項目をベースにしたフィルタ」 をお読みください) 。

> sudo journalctl -u apache2
[...]
Jun 03 10:07:11 pinkiepie systemd[1]: Starting The Apache Webserver...
Jun 03 10:07:12 pinkiepie systemd[1]: Started The Apache Webserver.

11.3 ジャーナル出力のフィルタリング Edit source

何もスイッチを指定しないで journalctl を実行すると、ジャーナル内にある全ての情報を古いものから順に表示します。出力はスイッチと項目を指定することでフィルタすることができます。

11.3.1 起動番号をベースにしたフィルタ Edit source

journalctl では、特定のシステム起動時に限ってメッセージを表示することができます。全てのシステム起動を表示するには、下記のように実行します:

> sudo journalctl --list-boots
-1 097ed2cd99124a2391d2cffab1b566f0 Mon 2014-05-26 08:36:56 EDT—Fri 2014-05-30 05:33:44 EDT
 0 156019a44a774a0bb0148a92df4af81b Fri 2014-05-30 05:34:09 EDT—Fri 2014-05-30 06:15:01 EDT

一番左の列は起動オフセットと呼ばれる値で、 0 が現在の起動、 -1 が前回、 -2 が前々回のようになっています。 2 つ目の列には起動 ID が書かれていて、その後ろにはそれぞれのタイムスタンプが書かれています。

現在の起動に限定して全てのメッセージを表示するには、下記のように実行します:

> sudo journalctl -b

以前の起動時のジャーナルメッセージを表示したい場合は、オフセット値を指定します。たとえば前回の起動時のメッセージを表示したい場合は、下記のように実行します:

> sudo journalctl -b -1

起動時を指定するもう 1 つの方法としては、起動 ID を指定する方法があります。この場合は _BOOT_ID フィールドでフィルタを設定します:

> sudo journalctl _BOOT_ID=156019a44a774a0bb0148a92df4af81b

11.3.2 時間範囲をベースにしたフィルタ Edit source

journalctl の出力は、開始と終了の日時を指定してフィルタすることもできます。日付を指定する場合は、 "2014-06-30 9:17:16" のように指定します。また、時刻を省略した場合は "00:00:00" であるものと解釈され、時刻の秒を省略した場合は ":00" であるものと解釈されます。日付部分を省略した場合は、今日の日付であるものとして解釈されます。また、日付での表記の代替として、 "yesterday" (昨日), "today" (今日), "tomorrow" (明日) のような表現を使用することもできます。これらを指定した場合、時刻は "00:00:00" と解釈されます。さらに、 "now" と指定すると、現在の日時であるものとして解釈されます。このほか、 -+ を頭に付けて相対日時を指定することもできます。

現在以降の新しいメッセージを表示し、以後更新があるたびに随時表示するには、下記のように実行します:

> sudo journalctl --since "now" -f

今日になってから午前 3:20 までの全てのメッセージを表示するには、下記のように実行します:

> sudo journalctl --since "today" --until "3:20"

11.3.3 項目をベースにしたフィルタ Edit source

ジャーナルのメッセージは、特定の項目でフィルタして出力することができます。項目を指定する場合は、 フィールド名= の形式 (例: _SYSTEMD_UNIT=httpd.service) で指定します。また、 1 回の問い合わせで複数のフィルタを指定することもできます。既定で利用できる項目の一覧について、詳しくは man 7 systemd.journal-fields をお読みください。

特定のプロセス ID が生成したメッセージのみを表示するには、下記のように実行します:

> sudo journalctl _PID=1039

特定のユーザ ID に属するメッセージのみを表示するには、下記のように実行します:

# journalctl _UID=1000

カーネルのリングバッファからのメッセージのみを表示するには、下記のように実行します (dmesg コマンドが生成するものと同じ内容になります):

> sudo journalctl _TRANSPORT=kernel

サービスの標準出力や標準エラー出力のメッセージのみを表示するには、下記のように実行します:

> sudo journalctl _TRANSPORT=stdout

指定したサービスが生成したメッセージのみを表示するには、下記のように実行します:

> sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service

別々の項目に対して複数の条件を指定した場合は、同時に両方の条件に合致したメッセージのみを表示します:

> sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1488

同じ項目に対して複数の条件を指定した場合は、いずれかの条件に合致したメッセージを表示します:

> sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service

なお、 '+' のセパレータを指定することで、論理 'OR' を実現することができます。下記の例では、 Avahi サービスプロセスのプロセス ID 1480 のメッセージと、 D-Bus サービスのメッセージをあわせて表示します:

> sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1480 + _SYSTEMD_UNIT=dbus.service

11.4 systemd のエラー調査 Edit source

本章では、 systemdapache2 を起動する際に発生した問題を、調べて修正するまでの流れを説明しています。

  1. apache2 を開始してみます:

    # systemctl start apache2
    Job for apache2.service failed. See 'systemctl status apache2' and 'journalctl -xn' for details.
  2. サービスの状態はどのようになっているのかを調べてみます:

    > sudo systemctl status apache2
    apache2.service - The Apache Webserver
       Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled)
       Active: failed (Result: exit-code) since Tue 2014-06-03 11:08:13 CEST; 7min ago
      Process: 11026 ExecStop=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND \
               -k graceful-stop (code=exited, status=1/FAILURE)

    エラーを発生させているのはプロセス ID 11026 であることがわかります。

  3. プロセス ID 11026 に関連するメッセージを詳細に表示してみます:

    > sudo journalctl -o verbose _PID=11026
    [...]
    MESSAGE=AH00526: Syntax error on line 6 of /etc/apache2/default-server.conf:
    [...]
    MESSAGE=Invalid command 'DocumenttRoot', perhaps misspelled or defined by a module
    [...]
  4. /etc/apache2/default-server.conf ファイル内にスペルミスがあることがわかります。これを修正して apache2 サービスを開始しなおし、再度状態を確認してみます:

    > sudo systemctl start apache2 && systemctl status apache2
    apache2.service - The Apache Webserver
       Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled)
       Active: active (running) since Tue 2014-06-03 11:26:24 CEST; 4ms ago
      Process: 11026 ExecStop=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND
               -k graceful-stop (code=exited, status=1/FAILURE)
     Main PID: 11263 (httpd2-prefork)
       Status: "Processing requests..."
       CGroup: /system.slice/apache2.service
               ├─11263 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               ├─11280 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               ├─11281 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               ├─11282 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               ├─11283 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
               └─11285 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]

11.5 journald の設定 Edit source

systemd-journald サービスの動作は、 /etc/systemd/journald.conf を編集することで調整することができます。本章では基本的な設定のみを紹介しています。より詳しい設定ファイルの説明については、 man 5 journald.conf をお読みください。また、設定ファイルを変更したあとは、下記のコマンドで systemd-journald を再起動する必要があります:

> sudo systemctl restart systemd-journald

11.5.1 ジャーナルのサイズ制限の変更 Edit source

ジャーナルのログデータを恒久的な場所 (詳しくは 11.1項 「ジャーナルの恒久化」 をお読みください) に保存する場合、 /var/log/journal が配置されているファイルシステムに対して、最大 10% までの領域を使用します。たとえば /var/log/journal が 30 GB の /var パーティション内に存在する場合、ジャーナルは最大で 3 GB までのディスク領域を使用します。この制限を変更したい場合は、 SystemMaxUse オプションを変更し (およびコメントを外し) てください:

SystemMaxUse=50M

11.5.2 ジャーナルから /dev/ttyX への転送 Edit source

ジャーナルは、 /dev/tty12 などの特定の端末デバイスに転送することもできます。下記の journald オプションを変更してください:

ForwardToConsole=yes
TTYPath=/dev/tty12

11.5.3 ジャーナルから syslog への転送 Edit source

journald には、 rsyslog をはじめとした従来の syslog 実装との後方互換性が用意されています。この機能を利用するにあたっては、あらかじめ下記をご確認ください:

  • rsyslog がインストールされていること。

    > sudo rpm -q rsyslog
    rsyslog-7.4.8-2.16.x86_64
  • rsyslog サービスが有効化されていること。

    > sudo systemctl is-enabled rsyslog
    enabled
  • syslog への転送は /etc/systemd/journald.conf で設定します。

    ForwardToSyslog=yes

11.6 YaST を利用した systemd ジャーナルのフィルタリング Edit source

systemd ジャーナルを journalctl の文法を使用せずに簡単にフィルタリングするには、 YaST の journal モジュールを使用するとよいでしょう。 sudo zypper in yast2-journal でインストールを行ったあと、 YaST を起動して その他 › systemd ジャーナル を選択します。それ以外にも、コマンドラインから sudo yast2 journal と入力して実行してもかまいません。

YaST systemd ジャーナル
図 11.1: YaST systemd ジャーナル

このモジュールは、ログ項目を表形式で表示します。上部にある検索ボックスを使用すると、 grep を使用したときのように、指定した文字列を含む項目のみを表示することができます。また、日時やユニット、ファイルや重大度でフィルタを行いたい場合は、 フィルタの変更 を押して必要な設定を行ってください。

11.7 GNOME でのログ表示 Edit source

また、ジャーナルは GNOME Logs でも読むことができます。アプリケーションメニューから起動してお使いください。システムログメッセージを読むには root 権限が必要となりますので、 xdg-su gnome-logs などのようにして起動してください。このコマンドは、 AltF2 を押して起動することもできます。

このページを印刷