hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

journalctlコマンドの使い方



1 journalctlコマンドとは?

systemd環境ではログの収集は、systemd-journaldがおこなっています。journalctlコマンドは、systemd-journaldが収集したログを表示するためのコマンドです。時刻、ユニット名等を指定して、特定のログの絞り込みを簡単に行うことができます。

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

3 メッセージをリアルタイムに表示する方法(-f)

-fは、メッセージをリアルタイムに表示するオプションです。

[root@server ~]# journalctl -f

ターミナルをもう1つオープンして、loggerコマンドを実行します。-pにメッセージの重要度を指定します。ここでは、重要度がwarnのメッセージをジャーナルに出力してみます。

[root@server ~]#  logger -p warn test

loggerコマンドの実行結果を確認すると、メッセージがリアルタイムに表示されていることがわかります。

[root@server ~]# journalctl -f
 2月 28 18:55:03 server root[1648]: test

4 指定したユニットのメッセージを表示する方法(-u <ユニット名>)

-uは、指定したsystemdユニットのメッセージを表示するオプションです。ここでは、sshdのメッセージを表示してみます。

[root@server ~]# journalctl -u sshd
-- Logs begin at 日 2022-02-27 19:07:16 JST, end at 日 2022-02-27 20:03:12 JST. --
 2月 27 19:57:20 server sshd[2019]: Accepted password for root from 192.168.2.12 port 64677 ssh2

5 カーネルが出力するメッセージを表示する方法(-k)

-kは、カーネルが出力するメッセージを表示するオプションです。

[root@server ~]# journalctl -k
-- Logs begin at 日 2022-02-27 19:07:16 JST, end at 日 2022-02-27 20:05:06 JST. --
 2月 27 19:07:16 server systemd-journald[1678]: Received SIGTERM from PID 1 (systemd).

6 指定した重要度のメッセージを表示する方法(-p)

-pは、重要度を指定するオプションです。パラメータとして以下のものがあります。-pのパラメータには"emerg"といった文字列、もしくは数値(カッコ内)を指定することができます。
1. emerg(0) 重要度が一番高い。至急対処が必要。
2. alert(1)
3. crit(2)
4. err(3)
5. warning(4)
6. notice(5)
7. info(6)
8. debug(7) 重要度が一番低い。

6.1 alertのメッセージを表示する方法

事前準備として、loggerコマンドを使って、重要度がalertのメッセージをジャーナルに出力します。

[root@server ~]# logger -p alert p2

journalctlコマンドの実行結果を確認すると、重要度がalertのメッセージが表示されていることがわかります。

[root@server ~]# journalctl -p alert
 2月 28 19:03:31 server root[1663]: p2

6.2 複数の重要度のメッセージを同時に表示する方法

alert とcritの2つの重要度のメッセージを同時に表示してみます。まず、alertとcritの重要度のメッセージをジャーナルに出力します。

[root@server ~]# logger -p alert level1
[root@server ~]# logger -p crit level2

-pのパラメータにalert,critを指定して、journalctl を実行します。重要度がalertとcritのメッセージが表示されていることがわかります。

[root@server ~]#  journalctl -p alert -p crit
 2月 28 09:39:41 server root[1559]: level1
 2月 28 09:39:47 server root[1560]: level2

7 特定期間のメッセージだけを表示する方法(--since, --until)

7.1 開始日時を指定する方法(--since)

--sinceは、メッセージ表示の開始時刻を指定するオプションです。

[root@server ~]#  journalctl --since="2022-02-28 00:00:00"
-- Logs begin at 月 2022-02-28 09:32:14 JST, end at 月 2022-02-28 10:07:32 JST. --
 2月 28 09:32:14 server systemd-journal[110]: Runtime journal is using 8.0M (max allowed 188.5M, trying to leave 282.8M f
-snip-

7.2 開始終了日時を指定する方法(--since,--until)

--sinceは開始時刻、--untilは終了時刻を指定するオプションです。

[root@server ~]# journalctl --since="2022-02-28 00:00:00" --until="2022-02-28 23:00:00"
-- Logs begin at 月 2022-02-28 09:32:14 JST, end at 月 2022-02-28 10:05:27 JST. --
 2月 28 09:32:14 server systemd-journal[110]: Runtime journal is using 8.0M (max allowed 188.5M, trying to leave 282.8M f
-snip-

7.3 指定した時刻とユニットでメッセージを絞り込む方法

指定した時刻内において、sshdが出力したメッセージを表示してみます。

[root@server ~]# journalctl -u sshd --since="2022-02-28 00:00:00" --until="2022-02-28 23:00:00"
-- Logs begin at 月 2022-02-28 16:32:11 JST, end at 月 2022-02-28 16:35:03 JST. --
 2月 28 16:32:28 server systemd[1]: Starting OpenSSH server daemon...
-snip-

7.4 指定した時刻と重要度でメッセージを絞り込む方法

指定した時刻内において、重要度がerrのメッセージを表示してみます。

[root@server ~]# journalctl -p err --since="2022-02-28 00:00:00" --until="2022-02-28 23:00:00"
-- Logs begin at 月 2022-02-28 16:32:11 JST, end at 月 2022-02-28 16:39:13 JST. --
 2月 28 16:32:12 server kernel: sd 0:0:0:0: [sda] Assuming drive cache: write through
 2月 28 16:32:18 server kernel: piix4_smbus 0000:00:07.3: SMBus Host Controller not enabled!
 2月 28 16:32:23 server systemd[1]: Failed to start Software RAID monitoring and management.

7.5 今日出力したメッセージを表示する方法(--since today)

「今日」とは、午前0時のことです。--since todayを指定すると、午前0時から現時点までのメッセージを表示します。

[root@server ~]# journalctl --since today
-- Logs begin at 月 2022-02-28 16:32:11 JST, end at 月 2022-02-28 16:43:23 JST. --
 2月 28 16:32:11 server systemd-journal[110]: Runtime journal is using 8.0M (max allowed 188.5M, trying to leave 282.8M f
 2月 28 16:32:11 server kernel: Initializing cgroup subsys cpuset
 2月 28 16:32:11 server kernel: Initializing cgroup subsys cpu
-snip-

8 特定プロセスのメッセージを表示する方法(_PID=)

sshdプロセスが出力するメッセージだけを表示してみます。まず、sshdプロセスのPIDを調べます。PID=967が親プロセス、PID=1498はPID=967の子プロセスであることがわかります。

[root@server ~]# ps -C sshd -o comm,pid,ppid
COMMAND            PID   PPID
sshd               967      1
sshd              1498    967

親プロセスが出力するメッセージを確認してみます。

[root@server ~]# journalctl _PID=967
-- Logs begin at 月 2022-02-28 16:32:11 JST, end at 月 2022-02-28 16:45:28 JST. --
 2月 28 16:32:28 server sshd[967]: Server listening on 0.0.0.0 port 22.
 2月 28 16:32:28 server sshd[967]: Server listening on :: port 22.

次に、子プロセスが出力するメッセージを確認してみます。

[root@server ~]# journalctl _PID=1498
-- Logs begin at 月 2022-02-28 16:32:11 JST, end at 月 2022-02-28 16:47:33 JST. --
 2月 28 16:34:28 server sshd[1498]: Accepted password for root from 192.168.2.12 port 56807 ssh2
 2月 28 16:34:28 server sshd[1498]: pam_unix(sshd:session): session opened for user root by (uid=0)

9 出力フォーマットを指定する方法(-o <フォーマット>)

9.1 マイクロ秒の時刻を表示する方法(-o short-precise)

short-preciseは、メッセージの出力時刻をマイクロ秒で表示するオプションです。

[root@server ~]# journalctl -o short-precise
-- Logs begin at 月 2022-02-28 16:32:11 JST, end at 月 2022-02-28 16:47:33 JST. --
 2月 28 16:32:11.620040 server systemd-journal[110]: Runtime journal is using 8.0M (max allowed 188.5M, trying to leave 2
 2月 28 16:32:11.620149 server kernel: Initializing cgroup subsys cpuset
 2月 28 16:32:11.620177 server kernel: Initializing cgroup subsys cpu
-snip-

9.2 OS起動時からの相対時刻を表示する方法(-o short-monotonic)

short-monotonicは、OS起動時からの相対時刻を表示するオプションです。

[root@server ~]# journalctl -o short-monotonic
-- Logs begin at 月 2022-02-28 16:32:11 JST, end at 月 2022-02-28 16:47:33 JST. --
[    2.037029] server systemd-journal[110]: Runtime journal is using 8.0M (max allowed 188.5M, trying to leave 282.8M fre
[    0.000000] server kernel: Initializing cgroup subsys cpuset
[    0.000000] server kernel: Initializing cgroup subsys cpu
-snip-

9.3 json形式で表示する方法方法(-o json-pretty)

[root@server ~]# journalctl -u sshd -o json-pretty -n 1
{
        "__CURSOR" : "s=aaaa07a3038446248288e51c825ff196;i=85e;b=1127ca5682f240dbb447a8f95f04d77a;m=84641e0;t=5d90f1417f7
        "__REALTIME_TIMESTAMP" : "1646033668405123",
        "__MONOTONIC_TIMESTAMP" : "138822112",
        "_BOOT_ID" : "1127ca5682f240dbb447a8f95f04d77a",
        "PRIORITY" : "6",
        "_UID" : "0",
        "_GID" : "0",
        "_SYSTEMD_SLICE" : "system.slice",
        "_MACHINE_ID" : "cc95d5e11b57492fa2f013c560b342a5",
        "_HOSTNAME" : "server",
        "_CAP_EFFECTIVE" : "1fffffffff",
        "_TRANSPORT" : "syslog",
        "SYSLOG_FACILITY" : "10",
        "SYSLOG_IDENTIFIER" : "sshd",
        "_COMM" : "sshd",
        "_EXE" : "/usr/sbin/sshd",
        "_SYSTEMD_CGROUP" : "/system.slice/sshd.service",
        "_SYSTEMD_UNIT" : "sshd.service",
        "_SELINUX_CONTEXT" : "system_u:system_r:sshd_t:s0-s0:c0.c1023",
        "SYSLOG_PID" : "1498",
        "MESSAGE" : "Accepted password for root from 192.168.2.12 port 56807 ssh2",
        "_PID" : "1498",
        "_CMDLINE" : "sshd: root [priv]   ",
        "_SOURCE_REALTIME_TIMESTAMP" : "1646033668401983"
}

9.4 特定のフィールドでメッセージを絞り込む方法(-F <フィールド>)

json-pretty形式(9.3参照)の左端を<フィールド>として指定します。

[root@server ~]# journalctl -F _EXE
/usr/sbin/rsyslogd
/usr/libexec/postfix/master
/usr/sbin/postlog
-snip-

フィールドに_COMMを指定してみます。

[root@server ~]# journalctl -F _COMM
rsyslogd
kdumpctl
master
-snip-

10 ジャーナルの永続化方法

ジャーナルはtmpfsに保存されます。そのため、OSが再起動するとジャーナルが消えてしまいます。ここでは、OSが再起動してもジャーナルが消えないようにするための手順を示します。

設定ファイルのバックアップを作成します。

[root@server ~]# cp /etc/systemd/journald.conf /etc/systemd/journald.conf.org

変更内容は以下のとおりです。Storageのpersistentを有効にします。

[root@server ~]# diff -Nur /etc/systemd/journald.conf.org /etc/systemd/journald.conf
--- /etc/systemd/journald.conf.org      2022-02-28 16:57:32.282709334 +0900
+++ /etc/systemd/journald.conf  2022-02-28 16:58:12.391949992 +0900
@@ -12,9 +12,8 @@
 # See journald.conf(5) for details.

 [Journal]
 #Storage=auto
-#Storage=persistent
+Storage=persistent
 #Compress=yes
 #Seal=yes
 #SplitMode=uid

systemd-journaldサービス再起動前の状態を確認します。/var/log/journalディレクトリが存在しないことがわかります。

[root@server ~]# ls -d /var/log/journal
ls: /var/log/journal にアクセスできません: そのようなファイルやディレクトリはありません

systemd-journaldサービスを再起動します。

[root@server ~]# systemctl restart systemd-journald

systemd-journaldサービスを再起動すると、/var/log/journalディレクトリが作成されたことがわかります。ここにジャーナルが保存されます。

[root@server ~]# ls -d /var/log/journal
/var/log/journal

次に、/var/log/journalディレクトリ配下のファイルを確認します。ジャーナルを格納するディレクトリが作成されることがわかります。

[root@server ~]# ls -l /var/log/journal/
合計 0
drwxr-xr-x. 2 root root 28  2月 28 17:00 cc95d5e11b57492fa2f013c560b342a5

なお、ディレクトリの名前は /etc/machine-idの中身と同じです。

[root@server ~]# cat /etc/machine-id
cc95d5e11b57492fa2f013c560b342a5

11 ジャーナルの確認方法

永続化したジャーナルにはブートIDが設定されます。この値はOSがブートするたびに、新しいIDが設定されます。ここでは、ブートIDの確認方法、指定したブートIDのメッセージだけの表示方法について示します。

11.1 ブートIDを表示する方法(--list-boots)

初期状態のブートIDを確認します。

[root@server ~]# journalctl --list-boots
 0 1127ca5682f240dbb447a8f95f04d77a 月 2022-02-28 16:32:11 JST―月 2022-02-28 17:08:23 JST

OSを再起動(1回目)します。

[root@server ~]# shutdown -r now

再起動後、ブートIDを確認します。最新のブートIDの左端は0になることがわかります。0が一番新しく、この負の数の絶対数が大きくなるほど、古いジャーナルということになります。

[root@server ~]# journalctl --list-boots
-1 1127ca5682f240dbb447a8f95f04d77a 月 2022-02-28 16:32:11 JST―月 2022-02-28 17:09:53 JST
 0 79e5b081c7cb4a6fbc3eb68990329708 月 2022-02-28 17:10:03 JST―月 2022-02-28 17:11:34 JST

OSを再起動(2回目)します。

[root@server ~]# shutdown -r now

再起動後、ブートIDを確認します。

[root@server ~]# journalctl --list-boots
-2 1127ca5682f240dbb447a8f95f04d77a 月 2022-02-28 16:32:11 JST―月 2022-02-28 17:09:53 JST
-1 79e5b081c7cb4a6fbc3eb68990329708 月 2022-02-28 17:10:03 JST―月 2022-02-28 17:13:18 JST
 0 7b32cb1b269949dca0df8da1c98d3e07 月 2022-02-28 17:13:28 JST―月 2022-02-28 17:15:03 JST

11.2 指定したブートIDのメッセージだけを表示する方法(-b)

ブートIDが0のメッセージだけを表示してみます。

[root@server ~]# journalctl -b 0
-- Logs begin at 月 2022-02-28 16:32:11 JST, end at 月 2022-02-28 17:16:43 JST. --
 2月 28 17:13:28 server systemd-journal[110]: Runtime journal is using 8.0M (max allowed 188.5M, trying to leave 282.8M f
 2月 28 17:13:28 server kernel: Initializing cgroup subsys cpuset
 2月 28 17:13:28 server kernel: Initializing cgroup subsys cpu
-snip-

次に、ブートIDが-2のメッセージだけを表示してみます。

[root@server ~]# journalctl -b -2
-- Logs begin at 月 2022-02-28 16:32:11 JST, end at 月 2022-02-28 17:16:43 JST. --
 2月 28 16:32:11 server systemd-journal[110]: Runtime journal is using 8.0M (max allowed 188.5M, trying to leave 282.8M f
 2月 28 16:32:11 server kernel: Initializing cgroup subsys cpuset
 2月 28 16:32:11 server kernel: Initializing cgroup subsys cpu
-snip-

最後に、ブートIDが-2のメッセージの中で、重要度がerrのメッセージだけを表示してみます。

[root@server ~]# journalctl -b -2 -p err
-- Logs begin at 月 2022-02-28 16:32:11 JST, end at 月 2022-02-28 19:34:13 JST. --
 2月 28 16:32:12 server kernel: sd 0:0:0:0: [sda] Assuming drive cache: write through
 2月 28 16:32:18 server kernel: piix4_smbus 0000:00:07.3: SMBus Host Controller not enabled!
 2月 28 16:32:23 server systemd[1]: Failed to start Software RAID monitoring and management.

11.3 ジャーナルのディスク使用量を確認する方法(--disk-usage)

--disk-usageは、ジャーナルが使用しているディスク使用量を確認するためのオプションです。以下に結果より、ジャーナルが8M使用していることがわかります。

[root@server ~]# journalctl --disk-usage
Archived and active journals take up 8.0M on disk.

duコマンドを実行します。/var/log/journalディレクトリ配下のディスク使用量が8.1Mであることがわかります。

[root@server journal]# pwd
/var/log/journal
[root@server journal]# du -sh
8.1M    .

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ