journalctl
: systemd
ジャーナルへの問い合わせコマンド #Edit sourcesystemd
には独自のログ記録機能として、 ジャーナル と呼ばれる機能が用意されています。これにより、 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 [...]
ジャーナルは既定では /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/
に書き込まれるようになります。
journalctl
での便利なスイッチ #Edit source本章では、既定の journalctl
の動作を拡張するにあたって、便利なオプション類をいくつか紹介しています。全てのスイッチについての説明をご希望の場合は、 journalctl
のマニュアルページ (man 1 journalctl
) をご覧ください。
特定の実行ファイルに関連する全てのジャーナルメッセージを表示するには、実行ファイルのフルパスを指定します:
>
sudo
journalctl /usr/lib/systemd/systemd
直近のジャーナルメッセージのみを表示し、以後ジャーナルに更新があるたびに項目を随時表示します。
ジャーナルメッセージを表示して末尾に移動します。ページャを介して最新の項目から閲覧できるようになります。
ジャーナルのメッセージを逆順で表示します。最新の項目が最初に表示されるようになります。
カーネルメッセージのみを表示します。これは項目ベースのフィルタで、 _TRANSPORT=kernel
と同じ意味になります (詳しくは 11.3.3項 「項目をベースにしたフィルタ」 をお読みください) 。
指定した 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.
何もスイッチを指定しないで journalctl
を実行すると、ジャーナル内にある全ての情報を古いものから順に表示します。出力はスイッチと項目を指定することでフィルタすることができます。
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
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"
ジャーナルのメッセージは、特定の項目でフィルタして出力することができます。項目を指定する場合は、 フィールド名=値
の形式 (例: _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
systemd
のエラー調査 #Edit source本章では、 systemd
が apache2
を起動する際に発生した問題を、調べて修正するまでの流れを説明しています。
apache2 を開始してみます:
# systemctl start apache2 Job for apache2.service failed. See 'systemctl status apache2' and 'journalctl -xn' for details.
サービスの状態はどのようになっているのかを調べてみます:
>
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 であることがわかります。
プロセス 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 [...]
/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 [...]
systemd-journald サービスの動作は、 /etc/systemd/journald.conf
を編集することで調整することができます。本章では基本的な設定のみを紹介しています。より詳しい設定ファイルの説明については、 man 5 journald.conf
をお読みください。また、設定ファイルを変更したあとは、下記のコマンドで systemd-journald を再起動する必要があります:
>
sudo
systemctl restart systemd-journald
ジャーナルのログデータを恒久的な場所 (詳しくは 11.1項 「ジャーナルの恒久化」 をお読みください) に保存する場合、 /var/log/journal
が配置されているファイルシステムに対して、最大 10% までの領域を使用します。たとえば /var/log/journal
が 30 GB の /var
パーティション内に存在する場合、ジャーナルは最大で 3 GB までのディスク領域を使用します。この制限を変更したい場合は、 SystemMaxUse
オプションを変更し (およびコメントを外し) てください:
SystemMaxUse=50M
/dev/ttyX
への転送 #Edit sourceジャーナルは、 /dev/tty12
などの特定の端末デバイスに転送することもできます。下記の journald オプションを変更してください:
ForwardToConsole=yes TTYPath=/dev/tty12
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
systemd
ジャーナルのフィルタリング #Edit sourcesystemd ジャーナルを journalctl の文法を使用せずに簡単にフィルタリングするには、 YaST の journal モジュールを使用するとよいでしょう。 sudo zypper in yast2-journal
でインストールを行ったあと、 YaST を起動して › を選択します。それ以外にも、コマンドラインから sudo yast2 journal
と入力して実行してもかまいません。
このモジュールは、ログ項目を表形式で表示します。上部にある検索ボックスを使用すると、 grep
を使用したときのように、指定した文字列を含む項目のみを表示することができます。また、日時やユニット、ファイルや重大度でフィルタを行いたい場合は、 を押して必要な設定を行ってください。
また、ジャーナルは GNOME Logs でも読むことができます。アプリケーションメニューから起動してお使いください。システムログメッセージを読むには root 権限が必要となりますので、 xdg-su gnome-logs
などのようにして起動してください。このコマンドは、 Alt–F2 を押して起動することもできます。