21 journalctl: systemdジャーナルのクエリ #
systemdは、「ジャーナル」と呼ばれる独自のロギングシステムを備えています。すべてのシステムイベントがジャーナルに書き込まれるようになったため、syslogベースのサービスを実行する必要はありません。
ジャーナル自体は、systemdによって管理されるシステムサービスです。完全な名前はsystemd-journald.serviceです。カーネル、ユーザプロセス、標準入力、およびシステムサービスエラーから受信したログ情報に基づいて、構造化されたインデックスジャーナルを維持することで、ログデータを収集して保存します。systemd-journaldサービスはデフォルトでオンになっています。
>sudosystemctl 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 [...]
21.1 ジャーナルの永続化 #
ジャーナルは、デフォルトでは/run/log/journal/にログデータを保存します。/run/ディレクトリは本質的に揮発性であるため、再起動するとログデータは失われます。ログデータを永続化するには、/var/log/journal/ディレクトリを作成し、systemd-journaldサービスがデータを保存できるように、正しいアクセスモードと所有権があることを確認します。永続的なログ記録に切り替えるには、次のコマンドを実行します。
>sudomkdir /var/log/journal>sudosystemd-tmpfiles --create --prefix=/var/log/journal>sudojournalctl --flush
/run/log/journal/に保存されるログデータは/var/log/journal/にフラッシュされます。
21.2 journalctl: 便利なスイッチ #
このセクションでは、デフォルトのjournalctlの動作を拡張する一般的な便利なオプションをいくつか紹介します。スイッチはすべて、journalctlのマニュアルページのman 1
journalctlで説明されています。
特定の実行可能ファイルに関連するすべてのジャーナルメッセージを表示するには、実行可能ファイルのフルパスを指定します。
>sudojournalctl /usr/lib/systemd/systemd
- -f
最新のジャーナルメッセージのみを表示し、新しいログエントリがジャーナルに追加されるとそれらを出力します。
メッセージを出力してジャーナルの最後に移動します。これにより、最新のエントリをページャ内に表示できます。
- -r
ジャーナルのメッセージを逆順に出力します。これにより、最新のエントリが最初に一覧にされます。
- -k
カーネルメッセージのみを表示します。これは、フィールド照合機能
_TRANSPORT=kernelと同等です(21.3.3項 「フィールドに基づくフィルタ」を参照)。- -u
指定した
systemdユニットのメッセージのみを表示します。これは、フィールド照合機能_SYSTEMD_UNIT=UNITと同等です(21.3.3項 「フィールドに基づくフィルタ」を参照)。>sudojournalctl -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.
21.3 ジャーナル出力のフィルタ #
スイッチなしでjournalctlを呼び出すと、最も古いエントリを先頭にジャーナルのすべてのコンテンツが表示されます。出力は、特定のスイッチとフィールドによってフィルタできます。
21.3.1 ブート番号に基づくフィルタ #
journalctlは特定のシステムブートに基づいてメッセージをフィルタできます。利用可能なブートを一覧もするには、次を実行します。
>sudojournalctl --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
1番目の列にはブートオフセットが一覧にされます。現在のブートの場合は0、直前のブートの場合は-1、その1つ前のブートの場合は-2といった具合になります。2番目の列には、ブートIDが含まれ、特定のブートに限定するためのタイムスタンプが続きます。
現在のブートのすべてのメッセージを表示します。
>sudojournalctl -b
直前のブートのジャーナルメッセージを表示する必要がある場合は、オフセットパラメータを追加します。次の例は、直前のブートメッセージを出力します。
>sudojournalctl -b -1
もう1つの方法は、ブートIDに基づいてブートメッセージを一覧にする方法です。このためには、_BOOT_IDフィールドを使用します。
>sudojournalctl _BOOT_ID=156019a44a774a0bb0148a92df4af81b
21.3.2 時間間隔に基づくフィルタ #
開始日または終了日、あるいはその両方を指定して、journalctlの出力をフィルタできます。日付指定は、2014-06-30 9:17:16の形式にする必要があります。時間の部分を省略すると、夜中の12:00と想定されます。秒を省略すると、:00と想定されます。日付の部分を省略すると、当日と想定されます。数値式ではなく、キーワードyesterday、today、またはtomorrowを指定することができます。これらは、当日の前日の夜中の12:00、当日の夜中の12:00、または当日の翌日の夜中の12:00を示します。nowを指定すると、当日を示します。また、-または+をプレフィクスとして付けて、現在時刻の前後を示す相対時間を指定することもできます。
現在時刻以降の新しいメッセージのみを表示し、出力を継続的に更新します。
>sudojournalctl --since "now" -f
直前の夜12:00から午前3:20までのすべてのメッセージを表示します。
>sudojournalctl --since "today" --until "3:20"
21.3.3 フィールドに基づくフィルタ #
特定のフィールドによってジャーナルの出力をフィルタできます。照合するフィールドの構文は、FIELD_NAME=MATCHED_VALUEです(_SYSTEMD_UNIT=httpd.serviceなど)。1つのクエリに複数の照合を指定することで、出力メッセージをさらにフィルタすることができます。デフォルトフィールドのリストについては、man 7 systemd.journal-fieldsを参照してください。
特定のプロセスIDによって生成されたメッセージを表示します。
>sudojournalctl _PID=1039
特定のユーザIDに属するメッセージを表示します。
# journalctl _UID=1000
カーネルリングバッファのメッセージを表示します(dmesgが生成するものと同じ)。
>sudojournalctl _TRANSPORT=kernel
サービスの標準出力またはエラー出力のメッセージを表示します。
>sudojournalctl _TRANSPORT=stdout
指定されたサービスによって生成されたメッセージのみを表示します。
>sudojournalctl _SYSTEMD_UNIT=avahi-daemon.service
2つの異なるフィールドを指定すると、同時に両方の式に一致するエントリのみが表示されます。
>sudojournalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1488
2つの照合が同じフィールドを示している場合は、いずれかの式に一致するすべてのエントリが表示されます。
>sudojournalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service
+セパレータを使用して、2つの式を論理ORで組み合わせることができます。次の例は、プロセスIDが1480のAvahiサービスプロセスのすべてのメッセージと、D-Busサービスのすべてのメッセージを表示します。
>sudojournalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1480 + _SYSTEMD_UNIT=dbus.service
21.4 systemdエラーの調査 #
このセクションでは、apache2の起動時にsystemdによってレポートされたエラーを検出および修復する方法を示す簡単な例を紹介します。
apache2サービスの起動を試みます。
# systemctl start apache2 Job for apache2.service failed. See 'systemctl status apache2' and 'journalctl -xn' for details.
サービスの状態に関する記述を確認します。
>sudosystemctl 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です。
プロセスID11026に関連するメッセージの詳細バージョンを表示します。
>sudojournalctl -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サービスを起動して、そのステータスを出力します。>sudosystemctl 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 [...]
21.5 Journaldの設定 #
systemd-journaldサービスの動作を調整するには、/etc/systemd/journald.confを変更します。このセクションでは、基本的なオプションの設定のみを取り上げます。ファイルの詳細な説明については、man 5 journald.confを参照してください。変更を有効にするために、次のコマンドでジャーナルを再起動する必要があります。
>sudosystemctl restart systemd-journald
21.5.1 ジャーナルサイズ制限の変更 #
ジャーナルログデータを永続的な場所に保存する場合(21.1項 「ジャーナルの永続化」を参照)、ジャーナルログデータは/var/log/journalが存在するファイルシステムの最大10%を使用します。たとえば、/var/log/journalを30 GBの/varパーティションに配置すると、ジャーナルは最大3 GBのディスク容量を使用します。この制限を変更するには、SystemMaxUseオプションを変更(およびコメント解除)します。
SystemMaxUse=50M
21.5.2 ジャーナルの/dev/ttyXへの転送 #
ジャーナルを端末デバイスに転送し、好みの端末画面(たとえば、/dev/tty12)でシステムメッセージに関する通知を受信できます。journaldオプションを次のように変更します。
ForwardToConsole=yes TTYPath=/dev/tty12
21.5.3 ジャーナルのsyslog機能への転送 #
Journaldは、rsyslogなどの従来のsyslog実装との下位互換性があります。以下が正しいことを確認します。
rsyslogがインストールされている。
>sudorpm -q rsyslog rsyslog-7.4.8-2.16.x86_64rsyslogサービスが有効である。
>sudosystemctl is-enabled rsyslog enabled/etc/systemd/journald.confでsyslogへの転送が有効になっている。ForwardToSyslog=yes
21.6 YaSTを使用したsystemdジャーナルのフィルタ #
(journalctl構文を処理することなく)systemdジャーナルを簡単にフィルタするには、YaSTのジャーナルモジュールを使用します。sudo zypper in yast2-journalを使用してモジュールをインストールした後、YaSTで › の順に選択して起動します。または、コマンドラインで「sudo yast2 journal」と入力して起動します。
このモジュールでは、ログエントリが表に表示されます。上部にある検索ボックスを使用すると、grepを使用する場合と同様に、特定の文字を含むエントリを検索することができます。日時、ユニット、ファイル、または優先度でエントリをフィルタするには、をクリックし、個々のオプションを設定します。
21.7 GNOMEでのログの表示 #
GNOMEログでジャーナルを表示することができます。アプリケーションメニューから開始します。システムログメッセージを表示するには、rootとして実行する必要があります(たとえば、xdg-su
gnome-logsを使用)。このコマンドは、Alt–F2を押すと実行できます。
