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