Edited at

journalctl コマンドの使い方


1 journalctlコマンドとは?


2 環境

[root@master ~]# cat /etc/redhat-release

CentOS Linux release 7.3.1611 (Core)


3 ジャーナルおよび設定ファイルの格納場所

デフォルトは以下の場所にジャーナルが格納される。

[root@master journal]# pwd
/run/log/journal

設定ファイルは以下の場所にある。
[root@master ~]# cat /etc/systemd/journald.conf


4 特定ユニットのログを表示する(-u <ユニット名>)


4.1 sshdのログを表示する。

[root@master ~]# journalctl -u sshd

-- Logs begin at 金 2017-03-17 21:18:32 JST, end at 水 2017-04-05 21:24:55 JST. --
3月 17 21:19:19 master systemd[1]: Starting OpenSSH server daemon...
3月 17 21:19:19 master systemd[1]: PID file /var/run/sshd.pid not readable (yet?) after start.
3月 17 21:19:19 master sshd[1007]: Server listening on 0.0.0.0 port 22.
3月 17 21:19:19 master sshd[1007]: Server listening on :: port 22.
-以下、略-


4.2 dockerのログを表示する。

[root@master ~]# journalctl -u docker

-- Logs begin at 金 2017-03-17 21:18:32 JST, end at 水 2017-04-05 21:24:55 JST. --
3月 17 21:19:19 master systemd[1]: Starting Docker Application Container Engine...
3月 17 21:19:26 master systemd[1]: Started Docker Application Container Engine.
3月 17 21:24:45 master systemd[1]: Stopping Docker Application Container Engine...
3月 17 21:24:45 master dockerd-current[996]: time="2017-03-17T21:24:45.701324182+09:00" level=info msg="stopping containerd after r
3月 17 21:24:45 master dockerd-current[996]: time="2017-03-17T21:24:45.72281697+09:00" level=fatal msg="containerd: serve grpc" err
3月 17 21:24:45 master systemd[1]: Stopped Docker Application Container Engine.
-- Reboot --
-以下、略-


5 カーネルのログを表示する(-k)

[root@master ~]# journalctl -k

-- Logs begin at 日 2017-03-12 16:09:56 JST, end at 日 2017-03-12 21:22:39 JST. --
3月 12 16:09:56 localhost kernel: Initializing cgroup subsys cpuset
3月 12 16:09:56 localhost kernel: Initializing cgroup subsys cpu
3月 12 16:09:56 localhost kernel: Initializing cgroup subsys cpuacct
3月 12 16:09:56 localhost kernel: Linux version 3.10.0-514.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
3月 12 16:09:56 localhost kernel: Command line: BOOT_IMAGE=/vmlinuz-0-rescue-1ddaa2b4178f429b82a894ea90b7e7d0 root=UUID=92973cdf-c134-4016-8557-5785487bb8f9
-以下、略-


6 指定した重要度のログを表示する(-p)

重要度は以下のものがある。emergが一番重要度が高いです。つまり、緊急に対処を要するログです。

-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のログを表示する。

カーネルのalert(=1)レベルのログを出力する。-p alertと指定しても同じことができる。

[root@master ~]# journalctl -k -p 1

-- Logs begin at 日 2017-03-12 16:09:56 JST, end at 日 2017-03-12 21:22:39 JST. --
3月 12 21:22:36 master kernel: NMI watchdog: BUG: soft lockup - CPU#1 stuck for 30s! [vmtoolsd:483]
3月 12 21:22:36 master kernel: NMI watchdog: BUG: soft lockup - CPU#0 stuck for 32s! [kworker/0:1:21058]
-以下、略-


6.2 複数の重要度のログを同時に出力する。

以下は、errとwarningの2つの重要度のログを同時に出力する例です。

[root@master ~]# journalctl -p err -p warning

-- Logs begin at 金 2017-03-17 19:29:51 JST, end at 金 2017-03-17 20:22:06 JST. --
3月 17 19:29:51 localhost kernel: ACPI: RSDP 00000000000f6a10 00024 (v02 PTLTD )
3月 17 19:29:51 localhost kernel: ACPI: XSDT 000000003feea65b 0005C (v01 INTEL 440BX 06040000 VMW 01324272)
3月 17 19:29:51 localhost kernel: ACPI: FACP 000000003fefee73 000F4 (v04 INTEL 440BX 06040000 PTL 000F4240)
-以下、略-


7 特定期間のログだけを表示する。(--since, --until)


7.1 指定した時刻とユニットでログを絞り込む

[root@master ~]# journalctl -u kubelet.service --since="2017-04-01 00:00:00" --until="2017-04-05 00:00:00"

-- Logs begin at 金 2017-03-17 21:18:32 JST, end at 水 2017-04-05 20:50:11 JST. --
4月 01 09:11:30 master systemd[1]: Started Kubernetes Kubelet Server.
4月 01 09:11:30 master systemd[1]: Starting Kubernetes Kubelet Server...
4月 01 09:11:32 master kubelet[1146]: Flag --api-servers has been deprecated, Use --kubeconfig instead. Will be removed in a future
4月 01 09:11:32 master kubelet[1146]: Flag --configure-cbr0 has been deprecated, Will be removed in a future version. Please use ku
4月 01 09:11:32 master kubelet[1146]: W0401 09:11:32.438332 1146 server.go:549] Could not load kubeconfig file /var/lib/kubelet/
4月 01 09:11:36 master kubelet[1146]: I0401 09:11:36.945410 1146 docker.go:418] Connecting to docker on unix:///var/run/docker.s
4月 01 09:11:36 master kubelet[1146]: I0401 09:11:36.948627 1146 docker.go:438] Start docker client with request timeout=2m0s
4月 01 09:11:36 master kubelet[1146]: E0401 09:11:36.952476 1146 cni.go:163] error updating cni config: No networks found in /et
4月 01 09:11:37 master kubelet[1146]: I0401 09:11:37.366899 1146 manager.go:140] cAdvisor running in container: "/system.slice/k
[root@master ~]#


7.2 指定した時刻とログの重要度でログを絞り込む


[root@master ~]# journalctl -p 3 --since="2017-04-01 15:00:00" --until="2017-04-05 15:25:00"
-- Logs begin at 金 2017-03-17 21:18:32 JST, end at 水 2017-04-05 20:48:09 JST. --
4月 01 19:53:43 localhost kernel: sd 2:0:0:0: [sda] Assuming drive cache: write through
4月 01 19:54:04 master systemd-udevd[413]: could not read from '/sys/module/acpi_cpufreq/initstate': No such device
4月 01 19:54:24 master systemd[1]: Failed to start Docker Storage Setup.
-- Reboot --
4月 02 09:25:11 localhost kernel: sd 2:0:0:0: [sda] Assuming drive cache: write through
4月 02 09:25:35 master systemd[1]: Failed to start Docker Storage Setup.
4月 02 12:08:19 master lvmetad[378]: Failed to accept connection errno 11.
-- Reboot --
4月 02 19:12:01 localhost kernel: sd 2:0:0:0: [sda] Assuming drive cache: write through
4月 02 19:12:21 master systemd[1]: Failed to start Docker Storage Setup.
-- Reboot --
4月 03 09:16:09 localhost kernel: sd 2:0:0:0: [sda] Assuming drive cache: write through
4月 03 09:16:38 master systemd[1]: Failed to start Docker Storage Setup.


7.3 今日出力したログを表示する方法(--since today)

「今日」とは、午前0時のことです。

--since todayを指定すると、午前0時から現時点までのログを表示します。

今日出力したログを表示する。

[root@master ~]# journalctl --since today
-- Logs begin at 金 2017-03-17 19:29:51 JST, end at 金 2017-03-17 20:01:02 JST. --
3月 17 19:29:51 localhost systemd-journal[94]: Runtime journal is using 6.1M (max allowed 48.8M, trying to leave 73.2M free of 482.1M available →
3月 17 19:29:51 localhost kernel: Initializing cgroup subsys cpuset
3月 17 19:29:51 localhost kernel: Initializing cgroup subsys cpu
-以下、略-


8 最新のログを表示する(-f)

tail -f /var/log/messages と同じ動作をする。


[root@master journal]# journalctl -f
-- Logs begin at 日 2017-03-12 16:09:56 JST. --
3月 12 21:22:39 master kernel:
3月 12 21:22:39 master kernel: 44
3月 12 21:22:39 master kernel: 24 f8 00 00 00 00 49 8b bc 24 58 ff ff ff 66 66 66 66 90 66 83 07 02 fb 66 66 90 <66> 66 90 5b 41 5c 41 5d 41 5e 41 5f 5d c3 66 2e 0f 1f 84 00 00
3月 12 22:01:01 master systemd[1]: Started Session 9 of user root.
3月 12 22:01:01 master CROND[21208]: (root) CMD (run-parts /etc/cron.hourly)
3月 12 22:01:01 master systemd[1]: Starting Session 9 of user root.
3月 12 22:01:01 master run-parts(/etc/cron.hourly)[21211]: starting 0anacron
3月 12 22:01:01 master run-parts(/etc/cron.hourly)[21217]: finished 0anacron
-以下、略-


9 特定プロセスのログを表示する(_PID=<PID>)

sshdのプロセスIDを調べる

[root@master ~]# ps -C sshd
PID TTY TIME CMD
1031 ? 00:00:00 sshd
17740 ? 00:00:01 sshd

sshdのログを出力する。
[root@master ~]# journalctl _PID=1031
-- Logs begin at 金 2017-03-17 19:29:51 JST, end at 金 2017-03-17 20:22:06 JST. --
3月 17 19:30:54 master sshd[1031]: Server listening on 0.0.0.0 port 22.
3月 17 19:30:54 master sshd[1031]: Server listening on :: port 22.
[root@master ~]#


10 出力フォーマットの指定方法(-o <フォーマット>)

journalctlコマンドの出力フォーマットとして、次のようなものがある。


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

マイクロ秒の時刻が表示されていることがわかる。

[root@server ~]# journalctl -o short-precise
9月 05 20:40:13.514669 server kernel: device eth0 left promiscuous mode
9月 05 20:40:27.093890 server kernel: device eth0 entered promiscuous mode


10.2 絶対時刻ではなくOS起動時からの相対時刻を表示する方法(-o short-monotonic)

左端をみると、時刻ではなく、OS起動時からの相対時刻であることがわかる。

[root@master ~]# journalctl -o short-monotonic

[ 0.000000] localhost kernel: Initializing cgroup subsys cpuset
[ 0.000000] localhost kernel: Initializing cgroup subsys cpu
[ 0.000000] localhost kernel: Initializing cgroup subsys cpuacct
[ 0.000000] localhost kernel: Linux version 3.10.0-514.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-
[ 0.000000] localhost kernel: Command line: BOOT_IMAGE=/vmlinuz-0-rescue-1ddaa2b4178f429b82a894ea90b7e7d0 root=UUID=92973cdf-c134-4016-8557-578
[ 0.000000] localhost kernel: Disabled fast string operations

-中略-

[ 4.633375] localhost kernel: usb 2-1: New USB device found, idVendor=0e0f, idProduct=0003
[ 4.633386] localhost kernel: usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 4.633391] localhost kernel: usb 2-1: Product: VMware Virtual USB Mouse
[ 4.633396] localhost kernel: usb 2-1: Manufacturer: VMware
[ 4.637476] localhost kernel: e1000: Intel(R) PRO/1000 Network Driver - version 7.3.21-k8-NAPI
[ 4.637486] localhost kernel: e1000: Copyright (c) 1999-2006 Intel Corporation.
-以下、略-


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

dockerのログをjson形式で1エントリ(-n 1)だけ表示する。

[root@master ~]# journalctl -u docker -o json-pretty -n 1
{
"__CURSOR" : "s=46ba892f70824638b3d16da7d80834ac;i=a4f10;b=19b1f03dcfef43179df0082144e9f33a;m=44598cf;t=54c69409a0b92;x=cb2f553f676a9051",
"__REALTIME_TIMESTAMP" : "1491389822667666",
"__MONOTONIC_TIMESTAMP" : "71669967",
"_BOOT_ID" : "19b1f03dcfef43179df0082144e9f33a",
"_TRANSPORT" : "journal",
"_MACHINE_ID" : "1ddaa2b4178f429b82a894ea90b7e7d0",
"_HOSTNAME" : "master",
"PRIORITY" : "6",
"SYSLOG_FACILITY" : "3",
"_SELINUX_CONTEXT" : "system_u:system_r:init_t:s0",
"_UID" : "0",
"_GID" : "0",
"_CAP_EFFECTIVE" : "1fffffffff",
"CODE_FILE" : "src/core/job.c",
"CODE_LINE" : "776",
"CODE_FUNCTION" : "job_log_status_message",
"SYSLOG_IDENTIFIER" : "systemd",
"MESSAGE_ID" : "39f53479d3a045ac8e11786248231fbf",
"RESULT" : "done",
"_PID" : "1",
"_COMM" : "systemd",
"_EXE" : "/usr/lib/systemd/systemd",
"_CMDLINE" : "/usr/lib/systemd/systemd --switched-root --system --deserialize 21",
"_SYSTEMD_CGROUP" : "/",
"UNIT" : "docker.service",
"MESSAGE" : "Started Docker Application Container Engine.",
"_SOURCE_REALTIME_TIMESTAMP" : "1491389822657954"
}
[root@master ~]#


11 特定のフィールドでログを絞り込む(-F <フィールド>)

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

フィールドに_EXEを指定する。

[root@master ~]# journalctl -F _EXE
/usr/lib/systemd/systemd-shutdown
/usr/libexec/oci/hooks.d/oci-systemd-hook
/usr/bin/python2.7
/usr/bin/logger
/usr/sbin/anacron
-以下、略-

フィールドに_COMMを指定する。
[root@master ~]# journalctl -F _COMM
dmsetup
adduser
systemd-shutdow
oci-systemd-hoo
run-parts
-以下、略-

フィールドに_HOSTNAMEを指定する。
[root@master ~]# journalctl -F _HOSTNAME
master
localhost


12 ジャーナルログの永続化方法

デフォルトの設定だと、ジャーナルがtmpfsに保存されます。

そのため、OSが再起動するとジャーナルが消えてしまいます。

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

Storageにpersistentを指定する。

[root@master ~]# vi /etc/systemd/journald.conf
[Journal]
Storage=persistent

journaldを再起動する。
[root@master ~]# systemctl restart systemd-journald

/var/log/journal配下にジャーナルが保存されることがわかります。
[root@master 1ddaa2b4178f429b82a894ea90b7e7d0]# pwd
/var/log/journal/1ddaa2b4178f429b82a894ea90b7e7d0

[root@master 1ddaa2b4178f429b82a894ea90b7e7d0]# ls
system.journal
system@46ba892f70824638b3d16da7d80834ac-0000000000000001-00054aec2d13a8a4.journal
system@46ba892f70824638b3d16da7d80834ac-000000000001f81d-00054b26663a7cce.journal
system@46ba892f70824638b3d16da7d80834ac-000000000003d13f-00054b4f9f2eecae.journal
system@46ba892f70824638b3d16da7d80834ac-000000000005e2b4-00054bf1687fbb76.journal
system@46ba892f70824638b3d16da7d80834ac-000000000007c340-00054c1b1d5ce2a8.journal


13 永続化したジャーナルの確認方法

永続化したジャーナルにはブートIDが設定されます。この値はOSがブートするたびに、新しいIDが設定されます。

ここでは、ブートIDの確認方法、指定したブートIDのログだけの表示方法について示します。


13.1 ブートIDの表示方法(--list-boots)


リブート(1回目)

[root@master ~]# shutdown -r now


boot IDを表示する。
[root@master ~]# journalctl --list-boots
0 6b0cab27ac60436db709443e5580dae4 金 2017-03-17 21:18:32 JST―金 2017-03-17 21:20:51 JST


リブート(2回目)

[root@master ~]# shutdown -r now


boot IDを表示する。
[root@master ~]# journalctl --list-boots
-1 6b0cab27ac60436db709443e5580dae4 金 2017-03-17 21:18:32 JST―金 2017-03-17 21:24:53 JST
0 ee77551adf8c465ab61152fab7a2e860 金 2017-03-17 21:25:13 JST―金 2017-03-17 21:26:32 JST


bootID表示

[root@master log]# journalctl --list-boots

-32 6b0cab27ac60436db709443e5580dae4 金 2017-03-17 21:18:32 JST―金 2017-03-17 21:24:53 JST ★
-31 ee77551adf8c465ab61152fab7a2e860 金 2017-03-17 21:25:13 JST―金 2017-03-17 21:31:11 JST
-30 48809c69472849aabc01d09b7c07649a 金 2017-03-17 21:31:32 JST―金 2017-03-17 22:17:13 JST
-中略-
-2 cdd913e244e1437c8c27c8d856f9e2bf 月 2017-04-03 20:17:27 JST―月 2017-04-03 22:17:00 JST ★★
-1 7ae9d8b4a7a04116aa530a5ae7029a15 火 2017-04-04 20:04:08 JST―火 2017-04-04 22:51:20 JST
0 19b1f03dcfef43179df0082144e9f33a 水 2017-04-05 19:55:54 JST―水 2017-04-05 21:10:37 JST


13.2 指定したブートIDのログだけの表示方法(-b)

bootid=32のログを表示する。(上記13.1の★印)

[root@master ~]# journalctl -b -32
-- Logs begin at 金 2017-03-17 21:18:32 JST, end at 水 2017-04-05 22:01:23 JST. --
3月 17 21:18:32 localhost systemd-journal[95]: Runtime journal is using 6.1M (max allowed 48.8M, trying to leave 73.2M free of 482.1M available → current li
3月 17 21:18:32 localhost kernel: Initializing cgroup subsys cpuset
3月 17 21:18:32 localhost kernel: Initializing cgroup subsys cpu
3月 17 21:18:32 localhost kernel: Initializing cgroup subsys cpuacct
-以下、略-

bootid=2のログを表示する。(上記13.1の★★印)
[root@master ~]# journalctl -b -2
-- Logs begin at 金 2017-03-17 21:18:32 JST, end at 水 2017-04-05 22:01:23 JST. --
4月 03 20:17:27 localhost systemd-journal[94]: Runtime journal is using 6.1M (max allowed 48.8M, trying to leave 73.2M free of 482.1M available → current li
4月 03 20:17:27 localhost kernel: Initializing cgroup subsys cpuset
4月 03 20:17:27 localhost kernel: Initializing cgroup subsys cpu
4月 03 20:17:27 localhost kernel: Initializing cgroup subsys cpuacct


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

[root@master ~]# journalctl --disk-usage

Archived and active journals take up 688.0M on disk.

ジャーナル保存領域に移動する。
ジャーナル保存領域はデフォルトの場所から変更しています(/run/log/journalから/var/log/journal)
[root@master journal]# pwd
/var/log/journal

ディスク使用量を調べる。689M使用していることがわかる。
journalctlコマンドの結果とほぼ一致していることがわかる。
[root@master journal]# du -sh
689M .


15 ジャーナル保存領域の場所を指定する方法(-D <ジャーナル保存領域の場所>)

たとえば、障害調査対象マシンからジャーナルを転送して、自分のマシンでジャーナルを参照するような時に使える。

障害調査対象マシン 調査マシン
+--------------------------+ +-----------------------------------+
| | | |
| /var/log/journal --------- Transfer(scp) ------>| 任意の場所(例えば,/tmp/journal) |
| | | |
+--------------------------+ +-----------------------------------+
journalctl -D /tmp/journal

テスト用のディレクトリを作成する。
[root@master journal]# mkdir /tmp/journal

[root@master journal]# pwd
/var/log/journal
[root@master journal]# ls
1ddaa2b4178f429b82a894ea90b7e7d0

ジャーナルを/tmp/journal配下に全て移動する。
[root@master journal]# mv 1ddaa2b4178f429b82a894ea90b7e7d0 /tmp/journal/
[root@master journal]# ls

テスト用に作成したジャーナル保存領域の場所を指定して(-D)、journalctlコマンドを実行する。
[root@master journal]# journalctl -D /tmp/journal -u sshd
-- Logs begin at 金 2017-03-17 21:18:32 JST, end at 水 2017-04-05 22:01:23 JST. --
3月 17 21:19:19 master systemd[1]: Starting OpenSSH server daemon...
3月 17 21:19:19 master systemd[1]: PID file /var/run/sshd.pid not readable (yet?) after start.
3月 17 21:19:19 master sshd[1007]: Server listening on 0.0.0.0 port 22.
3月 17 21:19:19 master sshd[1007]: Server listening on :: port 22.
3月 17 21:19:19 master systemd[1]: Started OpenSSH server daemon.
3月 17 21:19:48 master sshd[1289]: Accepted password for root from 192.168.0.6 port 64887 ssh2
3月 17 21:24:45 master sshd[1007]: Received signal 15; terminating.
3月 17 21:24:45 master systemd[1]: Stopping OpenSSH server daemon...
3月 17 21:24:45 master systemd[1]: Stopped OpenSSH server daemon.
-- Reboot --
-以下、略-


16 /var/log/journal配下のディレクトリについて

/var/log/journal配下のディレクトリを確認する。ディレクトリ名は、/etc/machine-idに記載されているものである。

[root@master journal]# pwd
/var/log/journal
[root@master journal]# ls -l
合計 4
drwxr-sr-x+ 2 root systemd-journal 4096 4月 5 22:29 1ddaa2b4178f429b82a894ea90b7e7d0

/etc/machine-idの中身を確認する。上記ディレクトリ名になっていることがわかる。
[root@master ~]# cat /etc/machine-id
1ddaa2b4178f429b82a894ea90b7e7d0


Z 参考資料

RedHatマニュアル(20.10. JOURNAL の使用)

How To Use Journalctl to View and Manipulate Systemd Logs

「Systemd」を理解する ーシステム管理編ー

CentOS7システム管理ガイドsystemd/NetworkManager/Firewalld徹底攻略