108.2 レッスン 2
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
108 基本的なシステムサービス |
Objective: |
108.2 システムロギング |
Lesson: |
2 of 2 |
はじめに
すべての主要なディストリビューションが systemd
を採用したことで、ジャーナルデーモン(systemd-journald
)が標準のロギングサービスになりました。このレッスンでは、その動作と、さまざまな操作方法を説明します。例えば、ジャーナルへの問い合わせ、さまざまな条件によるフィルタリング、ストレージとサイズの設定、古いデータの削除、レスキューシステムやファイルシステムのコピーからのデータの取得などです。そして最後に、重要な rsyslogd
との相互作用を学習します。
systemd
の基本
Fedoraで初めて導入された systemd
は、ほとんどの主要なLinuxディストリビューションにおいて、SysV Initに代わる 事実上の システムとサービスのマネージャとなっています。長所を以下に示します:
-
容易な設定: SysV Initのスクリプトとはまったく異なるユニットファイルを使います。
-
広範囲な管理: デーモンやプロセスだけではなく、デバイス、ソケット、マウントポイントなども管理します。
-
SysV InitおよびUpstartとの下位互換性を持っています。
-
起動時の並列ロード: Sysv Initがサービスを1つずつ実行するのに対して、systemdは複数のサービスを並列に実行します。
-
journal と呼ばれるロギングサービスを備えており、以下の長所を備えています。
-
すべてのログを1か所で集中管理します。
-
ログローテーションは必要ありません。
-
ログを無効にしたり、RAMに置いたり、あるいはディスクに永続化することができます。
-
ユニットとターゲット
systemd
は ユニット を単位として動作します。ユニットとは、systemd
が管理できるあらゆるリソースです(サービス、ネットワーク、Bluetoothなど)。それぞれのユニットは、ユニットファイル で定義します。ユニットファイルは /lib/systemd/system
にあるプレーンテキストファイルで、管理するリソース用の設定情報を(セクション と ディレクティブ の形式で)含んでいます。ユニットには多くの種類があります: service
、mount
、automount
、swap
、timer
、device
、socket
、path
、timer
、snapshot
、slice
、scope
、target
。ユニットファイルの名前は、<リソース名>.<ユニット種別>
となります(例えば reboot.service
)。
target は、従来のSysV Initにおけるランレベルに似た、特殊なユニット種類です。つまり、target unit は、複数のリソース(ユニット)をまとめて、所定のシステム状態を表します(たとえば graphical.target
は、SysV Initにおける ランレベル 5
に相当します)。システムの現在のターゲットを確認するには、systemctl get-default
コマンドを使用します。
carol@debian:~$ systemctl get-default graphical.target
ターゲットは親子(依存)関係を持てますから、あるターゲットから別のターゲットを起動できますが、SysV Initに親子関係の概念はありません。
Note
|
|
システムジャーナル: systemd-journald
systemd-journald
は、さまざまなソースからログ情報を受け取るシステムサービスです: カーネルメッセージ、(syslog形式の)シンプルなシステムメッセージ、サービスの標準出力と標準エラー出力、カーネル監査サブシステムからの監査レコードなど。(詳細は、systemd-journald
のマニュアルページを参照してください)。構造化され索引付けされたジャーナルを作成および保守しています。
その設定ファイルは /etc/systemd/journald.conf
で、他のサービスと同様に systemctl
コマンドを使用して start、restart、stop したり、status で稼働状態を確認できます。
root@debian:~# systemctl status systemd-journald systemd-journald.service - Journal Service Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset: enabled) Active: active (running) since Sat 2019-10-12 13:43:06 CEST; 5min ago Docs: man:systemd-journald.service(8) man:journald.conf(5) Main PID: 178 (systemd-journal) Status: "Processing requests..." Tasks: 1 (limit: 4915) CGroup: /system.slice/systemd-journald.service └─178 /lib/systemd/systemd-journald (...)
journal.conf.d/*.conf
にパッケージに固有の設定ファイルを置くこともできます(詳細は、journald.conf
のマニュアルページを参照してください)。
systemd-journald
を有効にすると、ジャーナルがディスク(永続的)ないしRAMベースのファイルシステム(揮発性)に保存されます。ジャーナルはプレーンテキストファイルではなく、バイナリファイルです。したがって、less
や more
などのテキスト表示ツールでその内容を読み取ることはできません。代わりに journalctl
コマンドを使用します。
ジャーナル内容の調査
journalctl
は、systemd
ジャーナルを照会するためのユーティリティです。rootであるか、sudo
を使用して呼び出す必要があります(訳注: 多くのディストリビューションでは、一般ユーザー権限でジャーナルを参照することができます)。オプションなしでクエリを実行すると、ジャーナル全体が時系列で表示されます(最も古いエントリが先頭に表示されます)。
root@debian:~# journalctl -- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:19:46 CEST. -- Oct 12 13:43:06 debian kernel: Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (...) Oct 12 13:43:06 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=b6be6117-5226-4a8a-bade-2db35ccf4cf4 ro qu (...)
オプションを指定して、より具体的な問い合わせを行います。
-r
-
逆順で(新しい順に)ジャーナルメッセージを表示します。
root@debian:~# journalctl -r -- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:30:30 CEST. -- Oct 12 14:30:30 debian sudo[1356]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 14:30:30 debian sudo[1356]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -r Oct 12 14:19:53 debian sudo[1348]: pam_unix(sudo:session): session closed for user root (...)
-f
-
直近のジャーナルメッセージを出力し、内容が追加されるとそのエントリを出力し続けます —
tail -f
と同様です。root@debian:~# journalctl -f -- Logs begin at Sat 2019-10-12 13:43:06 CEST. -- (...) Oct 12 14:44:42 debian sudo[1356]: pam_unix(sudo:session): session closed for user root Oct 12 14:44:44 debian sudo[1375]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -f Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by carol(uid=0) (...)
- q`-e`
-
ジャーナルの末尾部分を、画面いっぱいに(ページャーで)表示します。
root@debian:~# journalctl -e (...)q Oct 12 14:44:44 debian sudo[1375]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -f Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 14:45:57 debian sudo[1375]: pam_unix(sudo:session): session closed for user root Oct 12 14:48:39 debian sudo[1378]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -e Oct 12 14:48:39 debian sudo[1378]: pam_unix(sudo:session): session opened for user root by carol(uid=0)
-n <value>
、--lines=<value>
-
ジャーナル末尾の value 行を出力します(
<value>
を指定しない場合のデフォルトは10)。root@debian:~# journalctl -n 5 (...) Oct 12 14:44:44 debian sudo[1375]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -f Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 14:45:57 debian sudo[1375]: pam_unix(sudo:session): session closed for user root Oct 12 14:48:39 debian sudo[1378]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -e Oct 12 14:48:39 debian sudo[1378]: pam_unix(sudo:session): session opened for user root by carol(uid=0)
-k
、--dmesg
-
dmesg
コマンドと同様。root@debian:~# journalctl -k -- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:53:20 CEST. -- Oct 12 13:43:06 debian kernel: Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18 Oct 12 13:43:06 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=b6be6117-5226-4a8a-bade-2db35ccf4cf4 ro qu Oct 12 13:43:06 debian kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' Oct 12 13:43:06 debian kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' (...)
ジャーナルのナビゲーションと検索
次の方法でジャーナルの出力位置を移動できます。(訳注: 主要なコマンドは less
と同じです。ただし、行の折り返しは行われません)。
-
PageUp、PageDown、矢印キーを使用して、上下左右に移動します。(横スクロールもできます)。
-
>で、出力の最後に移動します。
-
<で、出力の先頭に移動します。
現在の位置から文字列を順方向・逆方向で検索できます。
-
前方検索: /を押して検索する文字列を入力し、Enterキーを押します。
-
後方検索: ?を押して検索する文字列を入力し、Enterキーを押します。
前後の一致文字列に移動するには、Nで次の一致へ、Shift+Nで前の一致へ、それぞれ移動します。
ジャーナルデータのフィルタリング
ジャーナルでは、さまざまな条件でログデータをフィルタリングできます。
- ブート番号
-
--list-boots
-
保存されているブート履歴を一覧表示します。出力は3つの列で構成され、最初のものはブート番号を示します(
0
が現在の、-1
が直前の、-2
がその前のブートを示します)。2番列目はブートIDで、3列目はタイムスタンプです。root@debian:~# journalctl --list-boots 0 83df3e8653474ea5aed19b41cdb45b78 Sat 2019-10-12 18:55:41 CEST—Sat 2019-10-12 19:02:24 CEST
-b
、--boot
-
現在のブートにおけるすべてのジャーナルを表示します。以前のブートのログメッセージを表示するには、前項で説明したブート番号を指定します。たとえば、前回のブートメッセージを出力するには、
journalctl -b -1
と入力します。ただし、以前のログから情報を得るには、ジャーナルの永続化を有効にする必要があります(次のセクションで学習します)。root@debian:~# journalctl -b -1 Specifying boot ID has no effect, no persistent journal was found
- プライオリティ(優先度)
-
-p
-
-p
オプションで、プライオリティ(優先度)でフィルタリングすることもできます。root@debian:~# journalctl -b -0 -p err -- No entries --
現在のブートでは、プライオリティが
error
(以上)のメッセージがないことが示されました。なお、現在のブートを参照する場合には-b -0
を省略できます。Notesyslog
のプライオリティについては、前のレッスンを参照してください。
- 期間指定
-
journalctl
に、指定の期間(日時)内にログに記録されたジャーナルのみを出力させるには、--since
と--until
オプションを使用します。日付の指定には、YYYY-MM-DD HH:MM:SS
形式を使います。時刻を省略すると0時0分0秒と見なされ、日付を省略すると今日と見なされます。たとえば、午後7時から午後7時1分までにログに記録されたメッセージを表示するには、次のように指定します。root@debian:~# journalctl --since "19:00:00" --until "19:01:00" -- Logs begin at Sat 2019-10-12 18:55:41 CEST, end at Sat 2019-10-12 20:10:50 CEST. -- Oct 12 19:00:14 debian systemd[1]: Started Run anacron jobs. Oct 12 19:00:14 debian anacron[1057]: Anacron 2.3 started on 2019-10-12 Oct 12 19:00:14 debian anacron[1057]: Normal exit (0 jobs run) Oct 12 19:00:14 debian systemd[1]: anacron.timer: Adding 2min 47.988096s random time.
ちょっと前を意味する時刻指定も使用できます: たとえば、2分前からログに記録されたメッセージを表示するには、
journalctl --since "2 minutes ago"
、ないしは+
と-
を使用して、--since "-2 minutes"
と指定することもできます。分ではなく、キーワードで時刻を指定することもできます。
yesterday
-
前日の0時0分0秒
today
-
当日の0時0分0秒
tomorrow
-
翌日の0時0分0秒
now
-
現在時刻
今日の0時0分0秒から21:00までのすべてのメッセージを見てみましょう。
root@debian:~# journalctl --since "today" --until "21:00:00" -- Logs begin at Sat 2019-10-12 20:45:29 CEST, end at Sat 2019-10-12 21:06:15 CEST. -- Oct 12 20:45:29 debian sudo[1416]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/systemctl r Oct 12 20:45:29 debian sudo[1416]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 20:45:29 debian systemd[1]: Stopped Flush Journal to Persistent Storage. (...)
Note時刻指定の詳細な構文については、
systemd.time
のマニュアルページを参照してください。
- プログラム
-
ある実行可能ファイルに関連するジャーナルのみを表示するには、次の構文を使用します:
journalctl /path/to/executable
root@debian:~# journalctl /usr/sbin/sshd -- Logs begin at Sat 2019-10-12 20:45:29 CEST, end at Sat 2019-10-12 21:54:49 CEST. -- Oct 12 21:16:28 debian sshd[1569]: Accepted password for carol from 192.168.1.65 port 34050 ssh2 Oct 12 21:16:28 debian sshd[1569]: pam_unix(sshd:session): session opened for user carol by (uid=0) Oct 12 21:16:54 debian sshd[1590]: Accepted password for carol from 192.168.1.65 port 34052 ssh2 Oct 12 21:16:54 debian sshd[1590]: pam_unix(sshd:session): session opened for user carol by (uid=0)
- ユニット
-
ユニットとは、
systemd
が処理する1つのリソースでした。ユニットでジャーナルをフィルタリングすることもできます。-u
-
指定したユニットに関するメッセージのみを表示します。
root@debian:~# journalctl -u ssh.service -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 12:22:59 CEST. -- Oct 13 10:51:00 debian systemd[1]: Starting OpenBSD Secure Shell server... Oct 13 10:51:00 debian sshd[409]: Server listening on 0.0.0.0 port 22. Oct 13 10:51:00 debian sshd[409]: Server listening on :: port 22. (...)
Noteロードされて有効なユニットをすべて出力するには、
systemctl list-units
を使用します。インストールされているすべてのユニットファイルを表示するには、systemctl list-unit-files
を使用します。
- フィールド
-
指定した フィールド の値でジャーナルをフィルタリングするには、次の構文のいずれかを使用します:
-
<フィールド名>=<値>
-
_<フィールド名>=<値>_
-
__<フィールド名>=<値>
-
(訳注: フィールド名の前にある _
(アンダースコア)の数によって、アプリケーションが出力した値(アンダースコア無し)、ジャーナルに自動的に付加された値(アンダースコア1個)、ジャーナルエントリの位置を示す値(アンダースコア2個)に分類することが出来ます。)
PRIORITY=
-
syslog
プライオリティを、プライオリティ番号で指定します:root@debian:~# journalctl PRIORITY=3 -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 14:30:50 CEST. -- Oct 13 10:51:00 debian avahi-daemon[314]: chroot.c: open() failed: No such file or directory
journalctl -perr
コマンドと同じ結果になることに注意してください。 SYSLOG_FACILITY=
-
syslog
ファシリティを、ファシリティ番号で指定します。たとえば、次の例はファシリティ番号が1(rsyslogではuser)であるメッセージを表示します。root@debian:~# journalctl SYSLOG_FACILITY=1 -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 14:42:52 CEST. -- Oct 13 10:50:59 debian mtp-probe[227]: checking bus 1, device 2: "/sys/devices/pci0000:00/0000:00:06.0/usb1/1-1" Oct 13 10:50:59 debian mtp-probe[227]: bus: 1, device: 2 was not an MTP device Oct 13 10:50:59 debian mtp-probe[238]: checking bus 1, device 2: "/sys/devices/pci0000:00/0000:00:06.0/usb1/1-1" Oct 13 10:50:59 debian mtp-probe[238]: bus: 1, device: 2 was not an MTP device
_PID=
-
指定したPIDを持つプロセスによって生成されたメッセージを表示します。次の例は、
systemd
(訳注: PIDは必ず1です)によって生成されたすべてのメッセージを表示します。root@debian:~# journalctl _PID=1 -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 14:50:15 CEST. -- Oct 13 10:50:59 debian systemd[1]: Mounted Debug File System. Oct 13 10:50:59 debian systemd[1]: Mounted POSIX Message Queue File System. Oct 13 10:50:59 debian systemd[1]: Mounted Huge Pages File System. Oct 13 10:50:59 debian systemd[1]: Started Remount Root and Kernel File Systems. Oct 13 10:50:59 debian systemd[1]: Starting Flush Journal to Persistent Storage... (...)
_BOOT_ID
-
ブートIDを指定し、そのブート時のメッセージを選択します。例:
journalctl _BOOT_ID=83df3e8653474ea5aed19b41cdb45b78
_TRANSPORT
-
指定したトランスポートから受信したメッセージを表示します。次の値を指定できます:
audit
(カーネル監査サブシステム)、driver
(カーネル内部)、syslog
(syslogソケット)、journal
(ネイティブジャーナルプロトコル)、stdout
(サービスの標準出力ないし標準エラー出力)、kernel
(カーネルリングバッファ —dmesg
、journalctl -k
ないしjournalctl --dmesg
と同じ)root@debian:~# journalctl _TRANSPORT=journal -- Logs begin at Sun 2019-10-13 20:19:58 CEST, end at Sun 2019-10-13 20:46:36 CEST. -- Oct 13 20:19:58 debian systemd[1]: Started Create list of required static device nodes for the current kernel. Oct 13 20:19:58 debian systemd[1]: Starting Create Static Device Nodes in /dev... Oct 13 20:19:58 debian systemd[1]: Started Create Static Device Nodes in /dev. Oct 13 20:19:58 debian systemd[1]: Starting udev Kernel Device Manager... (...)
フィールドの組み合わせ
フィールドによるフィルタリングは、組み合わせて使用することができます。デフォルトではすべての条件に一致するメッセージのみが表示されます(論理 AND):
root@debian:~# journalctl PRIORITY=3 SYSLOG_FACILITY=0 -- No entries -- root@debian:~# journalctl PRIORITY=4 SYSLOG_FACILITY=0 -- Logs begin at Sun 2019-10-13 20:19:58 CEST, end at Sun 2019-10-13 20:21:55 CEST. -- Oct 13 20:19:58 debian kernel: acpi PNP0A03:00: fail to add MMCONFIG information, can't access extended PCI configuration (...)
論理 OR で2つの式を組み合わせるには、+
を使います:
root@debian:~# journalctl PRIORITY=3 + SYSLOG_FACILITY=0 -- Logs begin at Sun 2019-10-13 20:19:58 CEST, end at Sun 2019-10-13 20:24:02 CEST. -- Oct 13 20:19:58 debian kernel: Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (...9 Oct 13 20:19:58 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID= (...) (...)
また、同じフィールドに複数の値を指定すると、いずれかの値に一致するすべてのエントリが表示されます:
root@debian:~# journalctl PRIORITY=1 -- Logs begin at Sun 2019-10-13 17:16:24 CEST, end at Sun 2019-10-13 17:30:14 CEST. -- -- No entries -- root@debian:~# journalctl PRIORITY=1 PRIORITY=3 -- Logs begin at Sun 2019-10-13 17:16:24 CEST, end at Sun 2019-10-13 17:32:12 CEST. -- Oct 13 17:16:27 debian connmand[459]: __connman_inet_get_pnp_nameservers: Cannot read /pro Oct 13 17:16:27 debian connmand[459]: The name net.connman.vpn was not provided by any .se
Note
|
ジャーナルファイルには、記録される情報(フィールド)の違いによって5種類があります:。詳細は |
システムジャーナルへの手動入力: systemd-cat
前のレッスンでは、logger
コマンドでコマンドラインからシステムログにメッセージを送信することができることを学びました(訳注: logger
コマンドはジャーナルにもメッセージを送信します)。systemd-cat
コマンドも同様にジャーナルにメッセージを送信しますが、より柔軟です。シェルの機能とあわせて、標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)をジャーナルに送信できます。
パラメータを付けずに呼び出した場合は、stdin から読み取ったメッセージをジャーナルに送信します。入力を終わるには、Ctrl+D(EOF)を入力します。
carol@debian:~$ systemd-cat This line goes into the journal. ^D
コマンドの出力をパイプで繋げば、コマンドの標準出力がジャーナルに送信されます:
carol@debian:~$ echo "And so does this line." | systemd-cat
systemd-catコマンドの後に別のコマンドを続けると、そのコマンドの出力が(stderr 込みで)ジャーナルに送信されます:
carol@debian:~$ systemd-cat echo "And so does this line too."
-p
オプションでプライオリティを指定することもできます:
carol@debian:~$ systemd-cat -p emerg echo "This is not a real emergency."
その他のオプションについては、systemd-cat
のマニュアルページを参照してください。
ジャーナルの最後の4行を表示してみましょう:
carol@debian:~$ journalctl -n 4 (...) -- Logs begin at Sun 2019-10-20 13:43:54 CEST. -- Nov 13 23:14:39 debian cat[1997]: This line goes into the journal. Nov 13 23:19:16 debian cat[2027]: And so does this line. Nov 13 23:23:21 debian echo[2030]: And so does this line too. Nov 13 23:26:48 debian echo[2034]: This is not a real emergency.
Note
|
プライオリティが emergency のジャーナルエントリは、ほとんどのシステムで太字の赤で表示されます。 |
永続的なジャーナルストレージ
ジャーナルの保管方法には、次の3つのオプションがあります。
-
ジャーナリングを行わない(ただし、コンソールへの送信など、他の機能へのリダイレクトは行われる)。
-
ジャーナルをメモリに保持し、システムを再起動するたびにログを削除する。この場合、
/run/log/journal
ディレクトリが作成されて、ジャーナルの保管に使われます。(訳注:/run
以下のディレクトリは、tmpfs(メモリファイルシステム)であることが一般的です。) -
ログをディスクに書き込んで永続化する。この場合、ジャーナルは
/var/log/journal
ディレクトリのファイルに記録されます。
デフォルトの動作は次のとおりです: /var/log/journal/
が存在しない場合、ジャーナルは再起動時に失われるディレクトリ /run/log/journal/
内の、マシンID(/etc/machine-id
に保存された小文字の16進数32桁)を名前とするディレクトリに置かれます。
carol@debian:~$ ls /run/log/journal/8821e1fdf176445697223244d1dfbd73/ system.journal
lessコマンドで読み取ろうとすると警告が表示されるので、journalctl
コマンドで表示します:
root@debian:~# less /run/log/journal/9a32ba45ce44423a97d6397918de1fa5/system.journal "/run/log/journal/9a32ba45ce44423a97d6397918de1fa5/system.journal" may be a binary file. See it anyway? root@debian:~# journalctl -- Logs begin at Sat 2019-10-05 21:26:38 CEST, end at Sat 2019-10-05 21:31:27 CEST. -- (...) Oct 05 21:26:44 debian systemd-journald[1712]: Runtime journal (/run/log/journal/9a32ba45ce44423a97d6397918de1fa5) is 4.9M, max 39.5M, 34.6M free. Oct 05 21:26:44 debian systemd[1]: Started Journal Service. (...)
/var/log/journal/
が存在する場合は、その中の永続的なファイルにジャーナルが保存されます。このディレクトリを削除すると、systemd-journald
はそのディレクトリ再作成するのではなく、/run/log/journal
にジャーナルを書き込みます。/var/log/journal/
を作成しなおして systed を再起動すると、すぐに永続的なファイルへの保存が再開します。
root@debian:~# mkdir /var/log/journal/ root@debian:~# systemctl restart systemd-journald root@debian:~# journalctl (...) Oct 05 21:33:49 debian systemd-journald[1712]: Received SIGTERM from PID 1 (systemd). Oct 05 21:33:49 debian systemd[1]: Stopped Journal Service. Oct 05 21:33:49 debian systemd[1]: Starting Journal Service... Oct 05 21:33:49 debian systemd-journald[1768]: Journal started Oct 05 21:33:49 debian systemd-journald[1768]: System journal (/var/log/journal/9a32ba45ce44423a97d6397918de1fa5) is 8.0M, max 1.1G, 1.1G free. Oct 05 21:33:49 debian systemd[1]: Started Journal Service. Oct 05 21:33:49 debian systemd[1]: Starting Flush Journal to Persistent Storage... (...)
Note
|
ログインしているユーザー用のジャーナルファイルも、デフォルトでは |
ジャーナルデーモンがどこにジャーナルを置くかを指定するには、設定ファイル /etc/systemd/journald.conf
を調整します。オプション Storage=
に次のいずれかの値を指定します。
Storage=volatile
-
ジャーナルは
/run/log/journal/
に保存されます。ディレクトリが存在しない場合は作成されます。 Storage=persistent
-
ジャーナルはディスク(
/var/log/journal/
)に保存されます。起動の初期段階など、ディスクに書き込めない場合はメモリ(/run/log/journal/
)にフォールバックします。必要に応じて、両方のディレクトリが作成されます。 Storage=auto
-
auto
はpersistent
と同じですが、ディレクトリ/var/log/journal
が自動的に作成されることがありません。これがデフォルトです。 Storage=none
-
すべてのジャーナルは破棄されます。ただし、コンソールやカーネルログバッファ、syslogソケットなど、他のターゲットへの転送は行われます。
たとえば、systemd-journald
が自動的に /var/log/journal/
を作成し、ジャーナルをディスクに保存したい場合は、/etc/systemd/journald.conf
を編集して Storage=persistent
を指定します。その後、sudo systemctl restart systemd-journald
でデーモンを再起動します。正常に再起動したことを確認するために、デーモンのステータスを確認しましょう。
root@debian:~# systemctl status systemd-journald systemd-journald.service - Journal Service Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset: enabled) Active: active (running) since Wed 2019-10-09 10:03:40 CEST; 2s ago Docs: man:systemd-journald.service(8) man:journald.conf(5) Main PID: 1872 (systemd-journal) Status: "Processing requests..." Tasks: 1 (limit: 3558) Memory: 1.1M CGroup: /system.slice/systemd-journald.service └─1872 /lib/systemd/systemd-journald Oct 09 10:03:40 debian10 systemd-journald[1872]: Journal started Oct 09 10:03:40 debian10 systemd-journald[1872]: System journal (/var/log/journal/9a32ba45ce44423a97d6397918de1fa5) is 8.0M, max 1.2G, 1.2G free.
Note
|
|
古いジャーナルデータの削除:ジャーナルサイズ
ジャーナルデータは、/run/log/journal
または /var/log/journal
に置かれる ジャーナルファイル に保存されます。ファイル名のサフィックスは .journal
または .journal~
です。ジャーナルファイル全体が占有しているディスク容量を確認するには、--disk-usage
オプションを指定します。
root@debian:~# journalctl --disk-usage Archived and active journals take up 24.0M in the filesystem.
systemd
のデフォルトでは、ジャーナル全体が使用する容量が、それが保存されているファイルシステムのサイズの最大10%に制限されます。たとえば、1GBのファイルシステムでは、100MBを超えません。上限に達すると古いログが消されて、この値の近くに留まります。
保存するジャーナルファイルのサイズ制限は、/etc/systemd/journald.conf
の設定オプションで調整できます。オプションは2種類あり、永続的なファイルシステム(/var/log/journal
)に対するものは先頭に System
が、メモリファイルシステム(/run/log/journal
)に対するものは先頭に Runtime
という単語が付きます。順に見ていきましょう。
SystemMaxUse=
、RuntimeMaxUse=
-
ジャーナルが占めるディスク容量を制御します。デフォルトではファイルシステム容量の10%ですが、4GiBまでの範囲で変更できます(たとえば
SystemMaxUse=500M
)。 SystemKeepFree=
、RuntimeKeepFree=
-
ユーザー用に空けておくディスク容量を制御します。デフォルトではファイルシステム容量の15%ですが、4GiBまでの範囲で変更できます(たとえば
SystemKeepFree=500M
)。*MaxUse
と*KeepFree
の両方を指定した場合は、両方を満たすようにジャーナルサイズが制限されます。なお、アクティブなジャーナルファイルは削除されないことに注意してください。 SystemMaxFileSize=
、RuntimeMaxFileSize=
-
個々のジャーナルファイルの最大サイズを制御します。デフォルトは
*MaxUse
の1/8です。制限値を超えた時にジャーナルのローテーションが同期的に行われます。値はバイト単位、もしくは、K
(Kibibytes)、M
(Mebibytes)、G
(Gibibytes)、T
(Tebibytes)、P
(Pebibytes)、E
(Exbibytes)単位で指定できます。 SystemMaxFiles=
、RuntimeMaxFiles=
-
保存するアーカイブの最大数を指定します(アクティブなジャーナルファイルは含みません)。デフォルトは100です。
サイズに基づくログメッセージの削除およびローテーションとは別に、MaxRetentionSec=
と MaxFileSec=
の2つのオプションを使用して、経過時間に基づくローテーションを指定することもできます。詳細は、journald.conf
のマニュアルページを参照してください。
Note
|
|
ジャーナルのお掃除
アクティブではない(アーカイブ)ジャーナルファイルを手動でクリーンアップするには、次の3つのオプションのいずれかを使用します。
--vacuum-time=
-
この時間に基づくオプションは、指定した時間よりも古いジャーナルメッセージを削除します。時間は、以下のいずれかのサフィックスを付けた数値で指定します:
s
、m
、h
、days
(d
)、months
、weeks
(w
)、years
(y
)。例として、ジャーナルのアーカイブから1ヶ月以上前のメッセージをすべて削除してみましょう:root@debian:~# journalctl --vacuum-time=1months Deleted archived journal /var/log/journal/7203088f20394d9c8b252b64a0171e08/system@27dd08376f71405a91794e632ede97ed-0000000000000001-00059475764d46d6.journal (16.0M). Deleted archived journal /var/log/journal/7203088f20394d9c8b252b64a0171e08/user-1000@e7020d80d3af42f0bc31592b39647e9c-000000000000008e-00059479df9677c8.journal (8.0M).
--vacuum-size=
-
この容量に基づくオプションは、ジャーナルが指定したサイズを下回るまで、ジャーナルアーカイブを削除します。容量は、以下のいずれかのサフィックスを付けた数値で指定します:
K
、M
、G
、T
。例として、アーカイブされたジャーナルファイルが 100メガバイト未満になるまで削除してみましょう:root@debian:~# journalctl --vacuum-size=100M Vacuuming done, freed 0B of archived journals from /run/log/journal/9a32ba45ce44423a97d6397918de1fa5.
--vacuum-files=
-
このオプションは、アーカイブジャーナルファイルの数が指定した数を下回るように古いアーカイブファイルを削除します。例として、10世代よりも古いアーカイブを削除してみましょう:
root@debian:~# journalctl --vacuum-files=10 Vacuuming done, freed 0B of archived journals from /run/log/journal/9a32ba45ce44423a97d6397918de1fa5.
削除されるのは、アーカイブされたジャーナルファイルのみです。アクティブなジャーナルを含む、すべてのエントリを削除したい場合は、--rotate
オプションを使用します。このオプションは、古いジャーナルの削除に先立って、デーモンにジャーナルファイルの即時ローテーションを指示するシグナル(SIGUSR2
)を送信します。他にもデーモンに指示を与えるシグナルを送信するオプションがあります。
--flush
(SIGUSR1)
-
ジャーナルをディスクに保存して永続化するために、
/run/
から/var/
へのジャーナルファイルのフラッシュを指示します。永続ロギングが有効で、/var/
がマウントされている必要があります。 --sync
(SIGRTMIN+1
)-
書き込まれていないすべてのログデータの、ディスクへの書き込み指示します。
Note
|
ジャーナルファイルの内部整合性を確認するには、 |
レスキューシステムからジャーナルデータを取得する
システム管理者は、レスキューシステム(ハードディスクを使用せずCDやUSBディスクから起動するLinuxシステム)を用いて、障害のあるマシンのハードディスク上のジャーナルファイルにアクセスしなければいけないことがあります。
journalctl
は、ジャーナルファイルを /var/log/journal/<machine-id>/
ディレクトリから探します。レスキューシステムと障害が発生しているシステムのマシンIDは異なるため、次のオプションを使用する必要があります。
-D </path/to/dir>
、--directory=</path/to/dir>
-
このオプションで、
journalctl
がジャーナルファイルを検索するディレクトリパスを指定します。
つまり、障害のあるシステムの ルートFS
(/dev/sda1
)を、レスキューシステムのファイルシステム(/media/carol/faulty.system/
)にマウントしたとすると、次のようにターゲットシステムのジャーナルファイルにアクセスします。
root@debian:~# journalctl -D /media/carol/faulty.system/var/log/journal/ -- Logs begin at Sun 2019-10-20 12:30:45 CEST, end at Sun 2019-10-20 12:32:57 CEST. -- oct 20 12:30:45 suse-server kernel: Linux version 4.12.14-lp151.28.16-default (geeko@buildhost) (...) oct 20 12:30:45 suse-server kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.12.14-lp151.28.16-default root=UUID=7570f67f-4a08-448e-aa09-168769cb9289 splash=> oct 20 12:30:45 suse-server kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' oct 20 12:30:45 suse-server kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' (...)
このケースでは、次のようなオプションも役立ちます。
-m
、--merge
-
/var/log/journal
にある、リモートマシンから転送されたものを含むすべてのジャーナルをマージします。 --file
-
指定したファイルのみからエントリを表示します。たとえば
journalctl --file /var/log/journal/64319965bda04dfa81d3bc4e7919814a/user-1000.journal
など。 --root
-
ジャーナルを探すファイルシステムのルートディレクトリを指定します。たとえば
journalctl --root /faulty.system/
など。
詳細は、journalctl
のマニュアルページを参照してください。
ログメッセージを syslog
に転送する
以下のいずれかの方法で、ジャーナルからのログデータを、syslog
デーモンで利用できます。
-
journaldの設定ファイルに
ForwardToSyslog=yes
オプションを指定して、ログメッセージを/run/systemd/journal/syslog
ソケット経由でsyslogd
に転送する。 -
rsyslog
デーモンにジャーナルを読み込むモジュールを組み込み、ジャーナルファイルから直接ログメッセージを読み取らせる。この場合、journaldの設定ファイルで、Storage
がnone
以外の値を指定する必要があります。
Note
|
他の宛先にログメッセージを転送することもでき、次のオプションを使用します: |
演習
-
目的に応じた
journalctl
コマンドで表を完成させてください。目的 コマンド カーネルからのエントリを表示する
ジャーナルの先頭から2番目のブートのメッセージを表示する
ジャーナルの末尾から2番目のブートのメッセージを表示する
直近のログメッセージを表示し、新しいメッセージを監視し続ける
新着のメッセージを表示し続ける
ブート以後のプライオリティが
warning
であるメッセージを逆順に表示する -
ジャーナルデーモンのストレージは、
/etc/systemd/journald.conf
のStorage
オプションで制御されます。それぞれの動作に対応するStorage
の値はどれですか?動作 Storage=auto
Storage=none
Storage=persistent
Storage=volatile
ログデータは破棄されるが、転送は行われる
システムが起動するとログデータが
/var/log/journal
に保存される。ディレクトリが存在しない場合は作成されるシステムが起動するとログデータが
/var/log/journal
に保存される。ディレクトリが存在しない場合でも作成さないログデータが
/var/run/journal
の下に保存されるが、再起動後によって無くなる -
ジャーナルを、時間、サイズ、ファイル数に基づいて手動で削除できることを学びました。次のタスクを実行するための、
journalctl
コマンドはどうなりますか?-
ジャーナルファイルが占めるディスク容量を確認する:
-
アーカイブジャーナルのファイル容量を、200MiB以内におさめる:
-
ディスク容量を再確認して、結果を分析する:
-
発展演習
-
メッセージを
/dev/tty5
に転送するために、/etc/systemd/journald.conf
に指定するオプションと値は何ですか? -
目的の出力を得るための、
journalctl
フィルターは何ですか?目的 フィルター + 値 あるユーザーによるメッセージを表示する
debian
という名前のホストからのメッセージを表示するあるグループに属するユーザーによるメッセージを表示する
root
によるメッセージを表示するコマンドのパスを用いて、
sudo
からのメッセージを表示するコマンド名を用いて、
sudo
からのメッセージを表示する -
プライオリティでフィルタリングする場合は、指定したプライオリティより高いプライオリティのログも含まれます。たとえば、
journalctl -p err
は、error、critical、alert および emergency のメッセージを出力します。しかし、journalctl
が表示するプライオリティ範囲を指定することもできます。journalctl
に、プライオリティが warning、error、critical であるメッセージのみを出力させるにはどうしますか? -
プライオリティを数値で指定することもできます。数値表現を使用して、前の演習のコマンドを書き直してください。
まとめ
このレッスンでは、以下の事柄を学びました:
-
システム/サービスマネージャーとして
systemd
を使用する利点。 -
systemd
ユニットとターゲットの基本。 -
systemd-journald
がどこからログデータ取得するか。 -
systemd-journald
を制御するsystemctl
のオプション:start
、status
、restart
、stop
。 -
ジャーナルの設定ファイル(
/etc/systemd/journald.conf
)と、その主要なオプション。 -
ジャーナルから条件に一致するデータのみを取り出す方法。
-
ジャーナルをナビゲートおよび検索する方法。
-
ジャーナルファイルを保存する方法: メモリ vs ディスク。
-
ジャーナル記録を無効化する方法。
-
ジャーナルが占有しているディスク容量を確認する方法、保存するジャーナルファイルのサイズを制限する方法、アーカイブされたジャーナルファイルを手動で削除する方法(バキューム)。
-
レスキューシステムからジャーナルデータを取得する方法。
-
ログデータを従来の
syslog
デーモンに転送する方法。
このレッスンでは、以下のコマンドを説明しました。
systemctl
-
systemd
システム/サービスマネージャーを制御します。 journalctl
-
systemd
ジャーナルを条件に従って表示します。 ls
-
ディレクトリの内容を一覧表示します。
less
-
ファイルの内容を(ページごとに)表示します。
mkdir
-
ディレクトリを作成します。
演習の解答
-
目的に応じた
journalctl
コマンドで表を完成させてください。目的 コマンド カーネルからのエントリを表示する
journalctl -k
ないしjournalctl --dmesg
ジャーナルの先頭から2番目のブートのメッセージを表示する
journalctl -b 2
ジャーナルの末尾から2番目のブートのメッセージを表示する
journalctl -b -2 -r
オプションの順序は問わない直近のログメッセージを表示し、新しいメッセージを監視し続ける
journalctl -f
新着のメッセージを表示し続ける
journalctl --since "now" -f
ブート以後のプライオリティが
warning
であるメッセージを逆順に表示するjournalctl -b -1 -p warning -r
-
ジャーナルデーモンのストレージは、
/etc/systemd/journald.conf
のStorage
オプションで制御されます。それぞれの動作に対応するStorage
の値はどれですか?動作 Storage=auto
Storage=none
Storage=persistent
Storage=volatile
ログデータは破棄されるが、転送は行われる
○
システムが起動するとログデータが
/var/log/journal
に保存される。ディレクトリが存在しない場合は作成される○
システムが起動するとログデータが
/var/log/journal
に保存される。ディレクトリが存在しない場合でも作成さない○
ログデータが
/var/run/journal
の下に保存されるが、再起動後によって無くなる○
-
ジャーナルを、時間、サイズ、ファイル数に基づいて手動で削除できることを学びました。次のタスクを実行するための、
journalctl
コマンドはどうなりますか?-
ジャーナルファイルが占めるディスク容量を確認する:
journalctl --disk-usage
-
アーカイブジャーナルのファイル容量を、200MiB以内に設定する:
journalctl --vacuum-size=200M
-
ディスク容量を再確認して、結果を分析する:
journalctl --disk-usage
--disk-usage
はアクティブなジャーナルとアーカイブされたジャーナルの合計容量を示しますが、--vacuum-size
はアーカイブのみに適用されます。
-
発展演習の解答
-
メッセージを
/dev/tty5
に転送するために、/etc/systemd/journald.conf
に指定するオプションと値は何ですか?ForwardToConsole=yes TTYPath=/dev/tty5
-
目的の出力を得るための、
journalctl
フィルターは何ですか?目的 フィルター + 値 あるユーザーによるメッセージを表示する
_ID=<user-id>
debian
という名前のホストからのメッセージを表示する_HOSTNAME=debian
あるグループに属するユーザーによるメッセージを表示する
_GID=<group-id>
root
によるメッセージを表示する_UID=0
コマンドのパスに基づいて、
sudo
からのメッセージを表示する_EXE=/usr/bin/sudo
コマンド名に基づいて、
sudo
からのメッセージを表示する_COMM=sudo
-
プライオリティでフィルタリングする場合は、指定したプライオリティより高いプライオリティのログも含まれます。たとえば、
journalctl -p err
は、error、critical、alert および emergency のメッセージを出力します。しかし、journalctl
が表示するプライオリティ範囲を指定することもできます。journalctl
に、プライオリティが warning、error、critical であるメッセージのみを出力させるにはどうしますか?+journalctl -p warning..crit
-
プライオリティを数値で指定することもできます。数値表現を使用して、前の演習のコマンドを書き直してください。
journalctl -p 4..2