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-journaldjournaldを再起動する必要がある。

永続化

journaldのログは設定次第ではOSの再起動で消える。
永続化設定をすると再起動してもログが消えなくなる。

永続化するには/etc/systemd/journald.confStorage=のコメントアウトを外して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.confSystemMaxUse=で保持するログの最大サイズを指定できる。

(省略)
SystemMaxUse=50M
(省略)

単位にはKMGTPEが指定できる。

保持するログの最大期間

/etc/systemd/journald.confMaxRetentionSec=で保持するログの最大期間を指定できる。

(省略)
MaxRetentionSec=4week
(省略)

指定できる単位はyearmonthweekdayhm。 指定しなければ秒単位で指定することになる。

その他の設定項目

その他/etc/systemd/journald.confに設定できる項目はマニュアルを参照。

» journald.conf