journalctlコマンド
ログの確認という話になると、よく出てくるコマンドです。オプションを使うと日付を指定することもできます。本記事ではデフォルトでは保存されないログの保管から、過去のログの呼び出しまでを詳しく検証しています。
書式
journalctl [オプション]
オプション
オプション | 説明 |
-a (–all) | 画面に表示できない文字も含めて表示する。 |
-b (–boot) | システムの起動時のログを見る。正の場合は最古から数え、負の場合は最新から数える。 ※以下の例と、検証で確認。 -b 1-> 最古のログ -b 2 -> 1より1つ新しいログ(以降3,4,….) -b -1 -> 前回起動時のログ -b -2 -> 前々回起動時のログ(以降-3,-4…) |
-D (–directory) | 指定したディレクトリのログを表示する。 |
-e (–pager-end) | 末尾を表示する。 |
-f (–follow) | 出力されたログを表示する(tailコマンドの-fと似ています) |
-k (–dmesg) | カーネルからのメッセージを表示する。 |
-l (–full) | 全てのログを表示する。 |
-n (–lines) | 出力する行数を指定する(headを用いなくても良くなります) |
–no-pager | lessコマンドで出力されず、catコマンドのように全てを表示します。ぜひとも-nオプションを併用しましょう(ログが多いので) |
-o (–output) | ログの出力形式を指定する。詳細表示(verbose)や、jsonなどが指定できる。short-monotonicを指定すると、起動してからの経過時間で表示される。 |
-r (–reverse) | 最新のログから表示します(sortコマンドと同じように、順番を逆にするイメージです) |
–since | 指定した日付以降のログを表示します。 |
–until | 指定した日付より前のログを表示します。 |
-u (–unit) | 指定したunitのログを表示します。 |
–vacuum-sice=サイズ | アーカイブのジャーナルが指定したサイズを下回るまで、古いジャーナルを削除します。 |
–vacuum-time=時間 | 指定した期間より古いアーカイブジャーナルを削除します。 |
-x | 説明文付きで表示します。 |
–list–boot | bootした履歴を表示する。 |
検証
検証1 –no-ppager
デフォルトではlessコマンドが使用されるので、–no-pagerを使用し、さらに表示する行数を3行に指定します。lessコマンドで表示されるのが嫌いな人向け。
1 2 3 4 5 |
~ # journalctl --no-pager -n 3 -- Logs begin at Wed 2021-01-20 16:46:27 JST, end at Fri 2021-01-22 17:04:46 JST. -- 1月 22 17:04:43 test01 systemd[1]: Started Network Manager Script Dispatcher Service. 1月 22 17:04:46 test01 systemd[3341]: Starting Mark boot as successful... 1月 22 17:04:46 test01 systemd[3341]: Started Mark boot as successful. |
検証2 ログの保管設定
ブート時のログを見ます。デフォルトの設定では、再起動をすると、起動時のログは削除されます。以下はログ保管に関する設定を行っていない場合の出力です。「ないよ!」ということで、怒られます。
1 2 |
~ # journalctl -b 1 n -3 Specifying boot ID or boot offset has no effect, no persistent journal was found. |
ログを保管し、journalctlで見られるようにするためには、「/etc/systemd/journald.conf」を編集します。編集前のデフォルトの状態は以下の状態になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[root@localhost ~]# cat /etc/systemd/journald.conf [Journal] #Storage=auto #Compress=yes #Seal=yes #SplitMode=uid #SyncIntervalSec=5m #RateLimitInterval=30s #RateLimitBurst=1000 #SystemMaxUse= #SystemKeepFree= #SystemMaxFileSize= #RuntimeMaxUse= #RuntimeKeepFree= #RuntimeMaxFileSize= #MaxRetentionSec= #MaxFileSec=1month #ForwardToSyslog=yes #ForwardToKMsg=no #ForwardToConsole=no #ForwardToWall=yes #TTYPath=/dev/console #MaxLevelStore=debug #MaxLevelSyslog=debug #MaxLevelKMsg=notice #MaxLevelConsole=info #MaxLevelWall=emerg #LineMax=48K |
ログの保存を有効化するには、「#Storage」のコメントアウトを削除し、パラメータを「persistent」にします。また、格納されるジャーナルファイルの大きさを制限するために、「RuntimeUse」のパラメータも「5G」に設定しておきます。(このあたりの容量は任意)
1 2 3 4 |
~ # grep -v "#" /etc/systemd/journald.conf [Journal] Storage=persistent RuntimeMaxUse=5G #容量の制限を5Gにしています。 |
※systemd-journaldを再起動することで設定を有効化できます。
さて、検証ために、OSを2回再起動しました。
まずは日付の確認をします。
1 2 3 4 |
~ # journalctl --list-boots -2 a7256d8c9c004003a6038f578cc1d831 Wed 2021-01-20 16:46:27 JST—Fri 2021-01-22 15:54:32 JST //3番目に新しい -1 ab5da7a178374cd589aa5aea13916755 Fri 2021-01-22 15:54:50 JST—Fri 2021-01-22 16:21:58 JST //2番目に新しい 0 a3d40a59839449aa9f72750a0ee3bc72 Fri 2021-01-22 16:22:19 JST—Fri 2021-01-22 17:33:49 JST //1番新しい |
今回の起動分を含め、合計3回分(過去の分は2回分)保存されています。
上から順に古く、一番下に出力されているログが1番新しいログになります。
オプションでも説明していますが、新しいログから数える場合は負の数で指定します。上記の結果の一番左に「-2」や「-1」とあります。「0」が一番新しく、この負の数が絶対数が大きくなるほど、古いログにということになります。
※基本的には負の数で指定すればわかりやすいですが、古いログから数えたい場合は正の数で指定します。「journalctl –list-boots」で表示される番号をそのまま流用できる点では、負の数で指定したほうがわかりやすい気もしますが、一応確認しています。
負の数で指定
前々回起動時のログを見ます。「-b -2 」で指定します。
1 2 3 4 5 |
~ # journalctl --no-pager -b -2 -n 3 -- Logs begin at Wed 2021-01-20 16:46:27 JST, end at Fri 2021-01-22 17:04:46 JST. -- 1月 22 15:54:32 dns01 systemd-shutdown[1]: Syncing filesystems and block devices. 1月 22 15:54:32 dns01 systemd-shutdown[1]: Sending SIGTERM to remaining processes... 1月 22 15:54:32 dns01 systemd-journald[28028]: Journal stopped |
前回起動時のログを見ます。 「-b -1 」で指定します。
1 2 3 4 5 |
~ # journalctl --no-pager -b -1 -n 3 -- Logs begin at Wed 2021-01-20 16:46:27 JST, end at Fri 2021-01-22 17:04:46 JST. -- 1月 22 16:21:58 dns01 systemd-shutdown[1]: Syncing filesystems and block devices. 1月 22 16:21:58 dns01 systemd-shutdown[1]: Sending SIGTERM to remaining processes... 1月 22 16:21:58 dns01 systemd-journald[705]: Journal stopped |
正の数で指定
最古のログを見ます。最古のログは、上記の「前々回の起動時のログ」と同じになるはずです。 「-b 1 」で指定します。
1 2 3 4 5 |
~ # journalctl --no-pager -b 1 -n 3 -- Logs begin at Wed 2021-01-20 16:46:27 JST, end at Fri 2021-01-22 17:04:46 JST. -- 1月 22 15:54:32 dns01 systemd-shutdown[1]: Syncing filesystems and block devices. 1月 22 15:54:32 dns01 systemd-shutdown[1]: Sending SIGTERM to remaining processes... 1月 22 15:54:32 dns01 systemd-journald[28028]: Journal stopped |
次に、最古のログより1つ新しいログを見ます。これは上記の「前回起動時のログ」と同じになります。 「-b 2 」で指定します。
1 2 3 4 5 |
~ # journalctl --no-pager -b 2 -n 3 -- Logs begin at Wed 2021-01-20 16:46:27 JST, end at Fri 2021-01-22 17:04:46 JST. -- 1月 22 16:21:58 dns01 systemd-shutdown[1]: Syncing filesystems and block devices. 1月 22 16:21:58 dns01 systemd-shutdown[1]: Sending SIGTERM to remaining processes... 1月 22 16:21:58 dns01 systemd-journald[705]: Journal stopped |
今回起動した際のログを見ます。
1 2 3 4 5 |
~ # journalctl --no-pager -n 3 -- Logs begin at Wed 2021-01-20 16:46:27 JST, end at Fri 2021-01-22 17:04:46 JST. -- 1月 22 17:04:43 test01 systemd[1]: Started Network Manager Script Dispatcher Service. 1月 22 17:04:46 test01 systemd[3341]: Starting Mark boot as successful... 1月 22 17:04:46 test01 systemd[3341]: Started Mark boot as successful. |
ややこしいですが、基本的に負の数指定のほうが操作しやすいですね。
検証3 形式指定して出力する
形式を変更して出力します。まずは指定しない場合。
1 2 3 |
~ # journalctl --no-pager -n 1 -- Logs begin at Wed 2021-01-20 16:46:27 JST, end at Fri 2021-01-22 17:04:46 JST. -- 1月 23 17:04:46 test01 systemd[3341]: Started Mark boot as successful. |
上記のログをjson形式で出力します。
1 2 |
~ # journalctl --no-pager -o json -n 1 { "__CURSOR" : "s=1b32cb1c8e35442891d4d0b1df421650;i=1e58;b=a3d40a59839449aa9f72750a0ee3bc72;m=964bc620;t=5b978a442eb79;x=c80c3f633103313a", "__REALTIME_TIMESTAMP" : "1611302686616441", "__MONOTONIC_TIMESTAMP" : "2521548320", "_BOOT_ID" : "a3d40a59839449aa9f72750a0ee3bc72", "PRIORITY" : "6", "SYSLOG_FACILITY" : "3", "SYSLOG_IDENTIFIER" : "systemd", "_TRANSPORT" : "journal", "_PID" : "3341", "_UID" : "1001", "_GID" : "1001", "_COMM" : "systemd", "_EXE" : "/usr/lib/systemd/systemd", "_CMDLINE" : "/usr/lib/systemd/systemd --user", "_CAP_EFFECTIVE" : "0", "_SELINUX_CONTEXT" : "unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023", "_AUDIT_SESSION" : "7", "_AUDIT_LOGINUID" : "1001", "_SYSTEMD_CGROUP" : "/user.slice/user-1001.slice/user@1001.service/init.scope", "_SYSTEMD_OWNER_UID" : "1001", "_SYSTEMD_UNIT" : "user@1001.service", "_SYSTEMD_USER_UNIT" : "init.scope", "_SYSTEMD_SLICE" : "user-1001.slice", "_SYSTEMD_USER_SLICE" : "-.slice", "_SYSTEMD_INVOCATION_ID" : "6327954a554747a592d7a1c0a2a56d2a", "_MACHINE_ID" : "dc5600e8ce2a4188ada0a0e68d9269ac", "CODE_FILE" : "../src/core/job.c", "CODE_LINE" : "827", "CODE_FUNC" : "job_log_status_message", "JOB_TYPE" : "start", "JOB_RESULT" : "done", "MESSAGE_ID" : "39f53479d3a045ac8e11786248231fbf", "USER_UNIT" : "grub-boot-success.service", "USER_INVOCATION_ID" : "d5ae503e09584f259b929b029e6a946d", "_HOSTNAME" : "test01", "MESSAGE" : "Started Mark boot as successful.", "_SOURCE_REALTIME_TIMESTAMP" : "1611302686615647" } |
すごくたくさん出てきた!といっても、one lineで出力されているからわかりにくいですよね。以下、整形した結果を載せておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
{ "__CURSOR": "s=1b32cb1c8e35442891d4d0b1df421650;i=1e58;b=a3d40a59839449aa9f72750a0ee3bc72;m=964bc620;t=5b978a442eb79;x=c80c3f633103313a", "__REALTIME_TIMESTAMP": "1611302686616441", "__MONOTONIC_TIMESTAMP": "2521548320", "_BOOT_ID": "a3d40a59839449aa9f72750a0ee3bc72", "PRIORITY": "6", "SYSLOG_FACILITY": "3", "SYSLOG_IDENTIFIER": "systemd", "_TRANSPORT": "journal", "_PID": "3341", "_UID": "1001", "_GID": "1001", "_COMM": "systemd", "_EXE": "/usr/lib/systemd/systemd", "_CMDLINE": "/usr/lib/systemd/systemd --user", "_CAP_EFFECTIVE": "0", "_SELINUX_CONTEXT": "unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023", "_AUDIT_SESSION": "7", "_AUDIT_LOGINUID": "1001", "_SYSTEMD_CGROUP": "/user.slice/user-1001.slice/user@1001.service/init.scope", "_SYSTEMD_OWNER_UID": "1001", "_SYSTEMD_UNIT": "user@1001.service", "_SYSTEMD_USER_UNIT": "init.scope", "_SYSTEMD_SLICE": "user-1001.slice", "_SYSTEMD_USER_SLICE": "-.slice", "_SYSTEMD_INVOCATION_ID": "6327954a554747a592d7a1c0a2a56d2a", "_MACHINE_ID": "dc5600e8ce2a4188ada0a0e68d9269ac", "CODE_FILE": "../src/core/job.c", "CODE_LINE": "827", "CODE_FUNC": "job_log_status_message", "JOB_TYPE": "start", "JOB_RESULT": "done", "MESSAGE_ID": "39f53479d3a045ac8e11786248231fbf", "USER_UNIT": "grub-boot-success.service", "USER_INVOCATION_ID": "d5ae503e09584f259b929b029e6a946d", "_HOSTNAME": "test01", "MESSAGE": "Started Mark boot as successful.", "_SOURCE_REALTIME_TIMESTAMP": "1611302686615647" } |
以下は「vernose -n 1」で詳細表示を出力させています。よく見ると以下のログをjson形式によく似ていますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
~ # journalctl --no-pager -o verbose -n 1 -- Logs begin at Wed 2021-01-20 16:46:27 JST, end at Fri 2021-01-22 17:04:46 JST. -- Fri 2021-01-23 17:04:46.615647 JST [s=1b32cb1c8e35442891d4d0b1df421650;i=1e58;b=a3d40a59839449aa9f72750a0ee3bc72;m=964bc620;t=5b978a442eb79;x=c80c3f633103313a] PRIORITY=6 SYSLOG_FACILITY=3 SYSLOG_IDENTIFIER=systemd _TRANSPORT=journal _PID=3341 _UID=1001 _GID=1001 _COMM=systemd _EXE=/usr/lib/systemd/systemd _CMDLINE=/usr/lib/systemd/systemd --user _CAP_EFFECTIVE=0 _SELINUX_CONTEXT=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 _AUDIT_SESSION=7 _AUDIT_LOGINUID=1001 _SYSTEMD_CGROUP=/user.slice/user-1001.slice/user@1001.service/init.scope _SYSTEMD_OWNER_UID=1001 _SYSTEMD_UNIT=user@1001.service _SYSTEMD_USER_UNIT=init.scope _SYSTEMD_SLICE=user-1001.slice _SYSTEMD_USER_SLICE=-.slice _SYSTEMD_INVOCATION_ID=6327954a554747a592d7a1c0a2a56d2a _BOOT_ID=a3d40a59839449aa9f72750a0ee3bc72 _MACHINE_ID=dc5600e8ce2a4188ada0a0e68d9269ac CODE_FILE=../src/core/job.c CODE_LINE=827 CODE_FUNC=job_log_status_message JOB_TYPE=start JOB_RESULT=done MESSAGE_ID=39f53479d3a045ac8e11786248231fbf USER_UNIT=grub-boot-success.service USER_INVOCATION_ID=d5ae503e09584f259b929b029e6a946d _HOSTNAME=test01 MESSAGE=Started Mark boot as successful. _SOURCE_REALTIME_TIMESTAMP=1611302686615647 |
すごいですね。たった1行のログですが、詳細表示にするとこの量になりました。
検証4 末尾から出力する
-eオプションを使うと、末尾から表示してくれます。
1 2 3 4 5 |
~ # journalctl --no-pager -e -n 3 -- Logs begin at Wed 2021-01-20 16:46:27 JST, end at Fri 2021-01-22 17:27:26 JST. -- 1月 22 17:27:21 test01 httpd[3877]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::54dd:47e6:e1b:1bc2. Set the 'ServerName' directive globally to suppress this message 1月 22 17:27:21 test01 systemd[1]: Started The Apache HTTP Server. 1月 22 17:27:26 test01 httpd[3877]: Server configured, listening on: port 80 |
検証5 末尾から出力する
-rオプションを指定しても最新のログから表示してくれます。
1 2 3 4 5 |
~ # journalctl --no-pager -r -n 3 -- Logs begin at Wed 2021-01-20 16:46:27 JST, end at Fri 2021-01-22 17:27:26 JST. -- 1月 22 17:27:21 test01 httpd[3877]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::54dd:47e6:e1b:1bc2. Set the 'ServerName' directive globally to suppress this message 1月 22 17:27:19 test01 systemd[1]: Starting The Apache HTTP Server... 1月 22 17:27:19 test01 systemd[1]: Stopped The Apache HTTP Server. |
検証6 日付指定をする
日付を指定します。以下は2021-01-21の12:00〜18:00を指定しています。
1 2 3 4 5 6 7 8 9 10 |
~ # journalctl --since "2021-01-21 12:00" --until "2021-01-21 18:00" --no-pager -- Logs begin at Wed 2021-01-20 16:46:27 JST, end at Fri 2021-01-22 17:33:49 JST. -- 1月 21 12:01:01 dns01 CROND[12877]: (root) CMD (run-parts /etc/cron.hourly) 1月 21 12:01:01 dns01 run-parts[12880]: (/etc/cron.hourly) starting 0anacron 1月 21 12:01:01 dns01 run-parts[12886]: (/etc/cron.hourly) finished 0anacron (途中省略) 1月 21 17:02:16 dns01 systemd[1]: Started Cleanup of Temporary Directories. 1月 21 17:02:56 dns01 systemd[1]: Starting dnf makecache... 1月 21 17:02:57 dns01 dnf[15470]: メタデータキャッシュは最近、リフレッシュされました。 1月 21 17:02:57 dns01 systemd[1]: Started dnf makecache. |
検証7 詳細表示をする
-xオプションで、説明をつけて表示します。結構便利です。トラブルシューティング時に活躍します。とはいえ、エラー発生時にログを見ても「つまり…このログの意味なんだろう?」ってことはよくありますね笑
1 2 3 4 5 6 7 8 9 10 11 |
~ # journalctl --no-pager -n 2 -x -- Logs begin at Wed 2021-01-20 16:46:27 JST, end at Fri 2021-01-22 17:27:26 JST. -- 1月 22 17:27:21 test01 systemd[1]: Started The Apache HTTP Server. -- Subject: Unit httpd.service has finished start-up -- Defined-By: systemd -- Support: https://access.redhat.com/support -- -- Unit httpd.service has finished starting up. -- -- The start-up result is RESULT. 1月 22 17:27:26 test01 httpd[3877]: Server configured, listening on: port 80 |