journald
systemd
のコンポーネントの1つで、systemd
で管理されているサービスのログを管理する。
正確にはsystemd-journald
というデーモンがログを管理している。
systemd-journald
が管理するログはバイナリで保持される。
バイナリであるため直接読めず、journalctl
コマンドを使ってログを見る。
journalctl
systemdで起動したサービスのログを見るにはjournalctl
コマンドを使う。
$ journalctl -u <サービス名>
-u
オプションでサービス名を指定する。
例えば、nginx
サービスのログを見るには以下のようにする。
$ journalctl -u nginx
journalctlでサービスを指定してログを見る
サービス名を探す
サービス名があやふやな場合はsystemctl
コマンドでサービス名を探す。
$ systemctl list-unit-files | grep enabled
amazon-ssm-agent.service enabled
auditd.service enabled
autovt@.service enabled
chronyd.service enabled
cloud-config.service enabled
cloud-final.service enabled
cloud-init-local.service enabled
cloud-init.service enabled
crond.service enabled
dbus-org.freedesktop.nm-dispatcher.service enabled
dbus-org.freedesktop.timedate1.service enabled
getty@.service enabled
import-state.service enabled
...
サービス名を指定してログを見る
journalctl
コマンドに上記で探したサービス名を-u
オプションに渡してログを見る。
$ journalctl -u サービス名
journalctl -u
に渡すサービス名は.service
を付けなくても良い。
以下はcrond.service
のログを見る例。
$ journalctl -u crond.service
-- Logs begin at Thu 2023-04-13 13:03:38 UTC, end at Thu 2023-04-13 13:12:12 UTC. --
Apr 13 13:05:03 ip-172-31-18-22.us-east-2.compute.internal systemd[1]: Started Command Scheduler.
Apr 13 13:05:03 ip-172-31-18-22.us-east-2.compute.internal crond[970]: (CRON) STARTUP (1.5.2)
Apr 13 13:05:03 ip-172-31-18-22.us-east-2.compute.internal crond[970]: (CRON) INFO (Syslog will be used instead of sendmail.)
Apr 13 13:05:03 ip-172-31-18-22.us-east-2.compute.internal crond[970]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 78% if use>
Apr 13 13:05:04 ip-172-31-18-22.us-east-2.compute.internal crond[970]: (CRON) INFO (running with inotify support)
$ journalctl -u crond
-- Logs begin at Thu 2023-04-13 13:03:38 UTC, end at Thu 2023-04-13 13:12:12 UTC. --
Apr 13 13:05:03 ip-172-31-18-22.us-east-2.compute.internal systemd[1]: Started Command Scheduler.
Apr 13 13:05:03 ip-172-31-18-22.us-east-2.compute.internal crond[970]: (CRON) STARTUP (1.5.2)
Apr 13 13:05:03 ip-172-31-18-22.us-east-2.compute.internal crond[970]: (CRON) INFO (Syslog will be used instead of sendmail.)
Apr 13 13:05:03 ip-172-31-18-22.us-east-2.compute.internal crond[970]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 78% if use>
Apr 13 13:05:04 ip-172-31-18-22.us-east-2.compute.internal crond[970]: (CRON) INFO (running with inotify support)
サービス名には*を指定できる
サービス名の一部しか覚えていないなど、サービス名があやふやな場合はワイルドカード*
を使って指定できる。
$ journalctl -u 'cloud*'
上記の例ではcloud
で始まるサービスのログを表示する。
後方マッチする場合は注意が必要。サービス名は正式には.service
が付くことを意識して以下のように.service
を含めて指定する。
$ journalctl -u '*-init.service'
部分一致でも*
を使って指定できる。
$ journalctl -u '*-init*'
カーネルのログを見る(-k)
-k
オプションを指定するとカーネルのログを表示する。
$ journalctl -k
-- Logs begin at Sat 2023-09-30 15:12:37 UTC, end at Sat 2023-09-30 15:16:16 UTC. --
Sep 30 15:12:37 localhost kernel: Linux version 4.18.0-348.el8.0.2.x86_64 (mockbuild@dal1-prod-builder001.bld.equ.rockylinu>
Sep 30 15:12:37 localhost kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/boot/vmlinuz-4.18.0-348.el8.0.2.x86_64 root=UUID=4b>
Sep 30 15:12:37 localhost kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
Sep 30 15:12:37 localhost kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
Sep 30 15:12:37 localhost kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
Sep 30 15:12:37 localhost kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
Sep 30 15:12:37 localhost kernel: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
Sep 30 15:12:37 localhost kernel: BIOS-provided physical RAM map:
Sep 30 15:12:37 localhost kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009dfff] usable
Sep 30 15:12:37 localhost kernel: BIOS-e820: [mem 0x000000000009e000-0x000000000009ffff] reserved
Sep 30 15:12:37 localhost kernel: BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
Sep 30 15:12:37 localhost kernel: BIOS-e820: [mem 0x0000000000100000-0x000000001fffffff] usable
Sep 30 15:12:37 localhost kernel: BIOS-e820: [mem 0x00000000fc000000-0x00000000ffffffff] reserved
...
サービスを指定せずに最近出力されたログを見る
journalctl -e
コマンドを実行するとsystemd全体のログのうち最近出力されたログが表示される。
$ journalctl -e
...
Apr 13 13:12:12 ip-172-31-18-22.us-east-2.compute.internal sudo[1071]: pam_unix(sudo:session): session opened for user root by (uid=0)
Apr 13 13:12:12 ip-172-31-18-22.us-east-2.compute.internal su[1085]: (to root) root on pts/0
Apr 13 13:12:12 ip-172-31-18-22.us-east-2.compute.internal su[1085]: pam_systemd(su-l:session): Cannot create session: Already running>
Apr 13 13:12:12 ip-172-31-18-22.us-east-2.compute.internal su[1085]: pam_unix(su-l:session): session opened for user root by (uid=0)
Apr 13 13:18:49 ip-172-31-18-22.us-east-2.compute.internal systemd[1]: Starting Cleanup of Temporary Directories...
Apr 13 13:18:49 ip-172-31-18-22.us-east-2.compute.internal systemd[1]: systemd-tmpfiles-clean.service: Succeeded.
Apr 13 13:18:49 ip-172-31-18-22.us-east-2.compute.internal systemd[1]: Started Cleanup of Temporary Directories.
-x
オプションも付加するとヘッダーごとにまとめられて読みやすくなる。
$ journalctl -xe
...
Apr 13 13:18:49 ip-172-31-18-22.us-east-2.compute.internal systemd[1]: systemd-tmpfiles-clean.service: Succeeded.
-- Subject: Unit succeeded
-- Defined-By: systemd
-- Support: https://access.redhat.com/support
--
-- The unit systemd-tmpfiles-clean.service has successfully entered the 'dead' state.
Apr 13 13:18:49 ip-172-31-18-22.us-east-2.compute.internal systemd[1]: Started Cleanup of Temporary Directories.
-- Subject: Unit systemd-tmpfiles-clean.service has finished start-up
-- Defined-By: systemd
-- Support: https://access.redhat.com/support
--
-- Unit systemd-tmpfiles-clean.service has finished starting up.
--
-- The start-up result is done.
その他便利なオプション
tail -fのようにログをリアルタイムで表示する(-f)
-f
オプションを付加するとtail -f
のようにリアルタイムでログを表示する。
$ journalctl -f -u サービス名
デバッグなどでプログラムを動作させつつログをリアルタイムで見たい場合に便利。
grep
--grep
オプションを指定するとgrep
で絞り込みをかけられる。
$ journalctl -u サービス名 --grep "検索文字列"
|
を使ってor
検索もできる。
$ journalctl -u サービス名 --grep "error|fatal"
上記ではerror
またはfatal
を含むログを表示する。
OSによっては--grep
オプションが有効になっていない。
その場合は以下のエラーが表示される。
Compiled without pattern matching support
その場合はパイプでつないでgrep
コマンドを使う。
$ journalctl -u サービス名 | grep -e "error" -e "fatal"
期間を指定してログを見る(–since、–until)
--since
、--until
オプションで期間を指定できる。
$ journalctl --since "開始日時" --until "終了日時" -u サービス名
以下は2023年4月13日13時5分から13時6分までのcrondログを見る例。
$ journalctl --since "2023-04-13 13:05:00" --until "2023-04-13 13:06:00" -u crond.service
今日のログを見る(–since today)
--since
オプションにtoday
を指定すると今日のログを表示する。
$ journalctl --since today -u サービス名
今日の0時から現在までのログが表示される。
末尾から指定した行数分のログを見る(-n)
-n
オプションで末尾から指定した行数分のログを表示する。
$ journalctl -n 行数 -u サービス名
行数を指定せずに-n
だけ指定した場合は10行表示する。
ログレベルの指定(-p)
-p
オプションでログレベルを指定できる。
ログレベルはdebug
からemerg
までの8段階でそれぞれ以下のように数値が割り当てられている。
- 0: emerg
- 1: alert
- 2: crit
- 3: err
- 4: warning
- 5: notice
- 6: info
- 7: debug
数値か文字列で指定できる。
$ journalctl -p info -u サービス名
..
で範囲を指定できる。
たとえばerr以上のログを見たい場合は以下のようにする。
$ journalctl -p 0..3 -u サービス名
正規表現で絞り込む(-g)
-g
オプションを指定すると正規表現で絞り込みをかけられる。
例えば以下はaudit
という文字列で始まるメッセージのみを表示する。
$ journalctl -g "^audit"
デフォルトでは大文字と小文字を区別しない。
--case-sensitive
オプションを付加すると大文字と小文字を区別する。
$ journalctl -g "^bios" --case-sensitive
システムプロセスだけ表示する(–system)
システムプロセスのみ表示するには--system
オプションをつける。
$ journalctl --system
ユーザプロセスだけ表示する(–user)
ユーザプロセスのみ表示するには--user
オプションをつける。
$ journalctl --user
ブート後のログを見る(-b)
-b
オプションでブート後のログを表示する。
$ journalctl -b -u サービス名
-b
オプションに数字を指定すると、その数字分前のブート後のログを表示する。
例えば以下は2回前のブート後のログを表示する。
$ journalctl -b 2 -u サービス名
最新のログから順に表示する(-r,–reverse)
journalctl
コマンドはデフォルトでは古いログから順に表示する。
最新から順に表示するには-r
もしくは--reverse
オプションを指定する。
$ journalctl -r -u サービス名
プロセスIDを指定してログを見る(_PID=プロセスID)
_PID
オプションでプロセスIDを指定するとそのプロセスが出力したログを表示する。
$ journalctl _PID=962
-- Logs begin at Sat 2023-09-30 15:12:37 UTC, end at Sat 2023-09-30 15:16:16 UTC. --
Sep 30 15:14:05 ip-10-0-15-64.ap-northeast-1.compute.internal sshd[962]: Server listening on 0.0.0.0 port 22.
Sep 30 15:14:05 ip-10-0-15-64.ap-northeast-1.compute.internal sshd[962]: Server listening on :: port 22.
JSON形式で出力する(-o json-pretty)
-o json-pretty
オプションを付加するとJSON形式で出力する。
$ journalctl -o json-pretty
{
"__CURSOR" : "s=7d01507d6cf341f0bb4a8c43526bde06;i=1;b=b9cdc7c540c14ed3b760138c1ecaae07;m=2046e2;t=60694f8b68382;x=>
"__REALTIME_TIMESTAMP" : "1696086757901186",
"__MONOTONIC_TIMESTAMP" : "2115298",
"_BOOT_ID" : "b9cdc7c540c14ed3b760138c1ecaae07",
"_SOURCE_MONOTONIC_TIMESTAMP" : "0",
"_TRANSPORT" : "kernel",
"PRIORITY" : "5",
"SYSLOG_FACILITY" : "0",
"SYSLOG_IDENTIFIER" : "kernel",
"MESSAGE" : "Linux version 4.18.0-348.el8.0.2.x86_64 (mockbuild@dal1-prod-builder001.bld.equ.rockylinux.org) (gcc v>
"_MACHINE_ID" : "d6e78ea742ef414eb1b3042b82788309",
"_HOSTNAME" : "localhost"
}
{
"__CURSOR" : "s=7d01507d6cf341f0bb4a8c43526bde06;i=2;b=b9cdc7c540c14ed3b760138c1ecaae07;m=204715;t=60694f8b683b5;x=>
"__REALTIME_TIMESTAMP" : "1696086757901237",
"__MONOTONIC_TIMESTAMP" : "2115349",
...
フィールドを絞り込む(-o json-pretty -F フィールド名)
さらに-F
オプションを付加すると指定したフィールド名だけ出力する。
以下はMESSAGEフィールドだけ出力する例。
$ journalctl -o json-pretty -F MESSAGE
Started Cleanup of Temporary Directories.
systemd-tmpfiles-clean.service: Succeeded.
Starting Cleanup of Temporary Directories...
pam_unix(su-l:session): session opened for user root by (uid=0)
pam_systemd(su-l:session): Cannot create session: Already running in a session or user slice
(to root) root on pts/0
Started Session c3 of user root.
Startup finished in 31ms.
...
journalが保持するログのディスク使用量を確認する(–disk-usage)
--disk-usage
オプションでjournalが保持するログのディスク使用量を確認できる。
$ journalctl --disk-usage
Archived and active journals take up 5.7M in the file system.
それぞれのユニットのログのヘッダ情報を表示する(–header)
--header
オプションを付加するとそれぞれのユニットのログのヘッダ情報を表示する。
データサイズなどの情報を確認できる。
最初のブロックには概要が表示され、それ以降のブロックに各ユニットの情報が表示される。
$ journalctl --header
(概要)
Header size: 264
Arena size: 8388344
Data hash table size: 184689
Field hash table size: 333
Rotate suggested: no
Head sequential number: 1 (1)
Tail sequential number: 3007 (bbf)
Head realtime timestamp: Sun 2024-01-28 14:13:29 UTC (610022223c7bd)
Tail realtime timestamp: Sun 2024-01-28 16:04:03 UTC (61003ad9a3964)
Tail monotonic timestamp: 1h 50min 34.061s (18b6bbcf6)
Objects: 12656
Entry objects: 3002
Data objects: 7125
Data hash table fill: 3.9%
Field objects: 125
Field hash table fill: 37.5%
Tag objects: 0
Entry array objects: 2402
Deepest field hash chain: 2
Deepest data hash chain: 2
Disk usage: 8.0M
(ユニットごと)
File path: /var/log/journal/ec28f83431cc76ed539d3e3d9ba7fa02/user-1001.journal
File ID: 93147ac667504be48c85cac5ffbf426b
Machine ID: ec28f83431cc76ed539d3e3d9ba7fa02
Boot ID: 13679f09802d41f69052c3d7aa277ef1
Sequential number ID: 93147ac667504be48c85cac5ffbf426b
State: OFFLINE
Compatible flags:
Incompatible flags: COMPRESSED-XZ KEYED-HASH COMPACT
Header size: 264
Arena size: 8388344
Data hash table size: 184689
Field hash table size: 333
Rotate suggested: no
Head sequential number: 1735 (6c7)
Tail sequential number: 2193 (891)
Head realtime timestamp: Sun 2024-01-28 14:16:54 UTC (610022e5e90a0)
Tail realtime timestamp: Sun 2024-01-28 14:48:03 UTC (610029dce4b9f)
Tail monotonic timestamp: 34min 34.070s (7b9fcf32)
Objects: 114
Entry objects: 5
Data objects: 45
Data hash table fill: 0.0%
Field objects: 26
Field hash table fill: 7.8%
Tag objects: 0
Entry array objects: 36
Deepest field hash chain: 0
Deepest data hash chain: 0
Disk usage: 8.0M
折返し表示したい
journalctl
の結果を折返し表示したい場合は環境変数SYSTEMD_LESS=FRXMK
をセットする。
$ SYSTEMD_LESS=FRXMK journalctl -u サービス名
特定ユニットのログを削除したい
ログが溜まってきて特定ユニットのログを削除したい場合は--vacuum-size
オプションと-u
を併用する。
$ journalctl --vacuum-size=100M -u サービス名
上記コマンドで100MBを残してログを削除する。
また、期間を指定したい場合は--vacuum-time
オプションを使用する。
$ journalctl --vacuum-time=1d -u サービス名
上記コマンドで直近1日分を残してログを削除する。
journaldの設定
journald
の設定は/etc/systemd/journald.conf
に記述されている。
/etc/systemd/journald.conf
の設定を変更した場合はsystemctl restart systemd-journald
でjournald
を再起動する必要がある。
永続化
journald
のログは設定次第ではOSの再起動で消える。
永続化設定をすると再起動してもログが消えなくなる。
永続化するには/etc/systemd/journald.conf
のStorage=
のコメントアウトを外してpersistent
を指定する。
[Journal]
(省略)
Storage=persistent
(省略)
persistent
を指定した場合は/var/log/journal
にログが保存される。
volatile
を指定した場合は/run/log/journal
にログが保存される。
auto
を指定した場合は/var/log/journal
ディレクトリが存在する場合は/var/log/journal
に保存され、ない場合は/run/log/journal
保存される。
/run/log
以下のディレクトリは再起動すると消えるディレクトリなので/run/log/journal
にログを保存する設定の場合は再起動するとログが消えて永続化されない。
保持するログの最大サイズ
/etc/systemd/journald.conf
のSystemMaxUse=
で保持するログの最大サイズを指定できる。
(省略)
SystemMaxUse=50M
(省略)
単位にはK
、M
、G
、T
、P
、E
が指定できる。
保持するログの最大期間
/etc/systemd/journald.conf
のMaxRetentionSec=
で保持するログの最大期間を指定できる。
(省略)
MaxRetentionSec=4week
(省略)
指定できる単位はyear
、month
、week
、day
、h
、m
。
指定しなければ秒単位で指定することになる。
その他の設定項目
その他/etc/systemd/journald.conf
に設定できる項目はマニュアルを参照。