journalctl コマンド:使い方とサービス別ログ、ジャーナル容量の整理

テスト環境RHEL系AlmaLinux 9.8systemd 252rootアカウントDebian 12 一般ユーザー2026-11-05 確認
システム情報・設定コマンドjournalctl場所/usr/bin/journalctl

サービスやカーネルが残したログを systemd ジャーナルから選んで読むツールが journalctl コマンドです。systemd を使う Linux では、systemd-journald がこれらのログをジャーナルに集めています。AlmaLinux 9 サーバーと Debian 12 サーバーでサービス・時間・重要度ごとにログを選んで読んだところ、一般アカウントには自分のログしか表示されず、ジャーナルをメモリに置くサーバーでは以前の起動を選べませんでした。

以下の出力は 2 台のサーバーで実行した結果です。ホスト名、アカウント、ブート ID、AlmaLinux サーバーのプロセス番号と systemd パッケージのリリースは例の値に置き換え、時刻は両サーバーとも UTC で出力しました。

1️⃣ journalctl コマンドの使い方と最近のログ

オプションなしで journalctl を実行するとジャーナルの最も古い行から less 画面で開くため、最近のログを見るときは -n で行数を指定します。-n の後ろの数字を省くと 10 行表示されます。

journalctl -n 3
Oct 28 07:14:06 server1 systemd[1]: session-3017.scope: Deactivated successfully.
Oct 28 07:14:06 server1 systemd[1]: session-3017.scope: Consumed 3.934s CPU time.
Oct 28 07:14:07 server1 sudo[851987]: pam_unix(sudo:session): session closed for user user

1 行は時刻、ホスト名、ログを残したプログラムとプロセス番号、メッセージの順で構成されます。-r を付けると順序が逆になり、最新の行がいちばん上に来ます。AlmaLinux サーバーの crond ログでは、最後に残った CMDEND 行がいちばん上でした。

journalctl -r -u crond -n 3
Oct 28 07:01:01 server1 CROND[841384]: (root) CMDEND (run-parts /etc/cron.hourly)
Oct 28 07:01:01 server1 run-parts[841394]: (/etc/cron.hourly) starting 0anacron
Oct 28 07:01:01 server1 CROND[841388]: (root) CMD (run-parts /etc/cron.hourly)

-f は最後の行を出力したあと終了せず、新しく入ってくる行を続けて出力します。Debian 12 サーバーで -q と -t myapp を付けて logger の最後の 1 行を表示したままにし、logger でさらに 2 行を残しました。残した 2 行がそのすぐ下に続きました。

journalctl -q -f -n 1 -t myapp
Oct 28 07:12:46 server2 myapp[347704]: journalctl error test
Oct 28 07:14:35 server2 myapp[347881]: follow line 1
Oct 28 07:14:36 server2 myapp[347877]: follow line 2

-f は Ctrl+C を押すまで止まらないため、サービスを再起動する間のログを見守るときに使います。

less 画面では画面幅より長い行は右側で切れ、切れた部分は矢印キーで確認します。出力をパイプやファイルに渡すと less を通りません。less なしで端末に直接表示するには --no-pager を付けます。

2️⃣ journalctl サービス別ログ

最近の行だけを見ると複数のサービスのログが混ざって出るため、1 つのサービスのログを見るときは -u でユニット名を指定します。ユニット名の末尾の .service は省略できます。

journalctl -u crond -n 4
Oct 28 06:01:01 server1 CROND[802926]: (root) CMDEND (run-parts /etc/cron.hourly)
Oct 28 07:01:01 server1 CROND[841388]: (root) CMD (run-parts /etc/cron.hourly)
Oct 28 07:01:01 server1 run-parts[841394]: (/etc/cron.hourly) starting 0anacron
Oct 28 07:01:01 server1 CROND[841384]: (root) CMDEND (run-parts /etc/cron.hourly)

-u を 2 回書くと 2 つのサービスのログが時刻順に混ざって出ます。AlmaLinux サーバーで 10 月 18 日 08:00 から 08:15 までの crond と nginx を一緒に選んだところ、08:01 の crond の 4 行のあとに 08:12 の nginx reload の 2 行が続きました。

journalctl -u nginx -u crond --since '2026-10-18 08:00' --until '2026-10-18 08:15'
Oct 18 08:01:01 server1 CROND[381522]: (root) CMD (run-parts /etc/cron.hourly)
Oct 18 08:01:01 server1 run-parts[381528]: (/etc/cron.hourly) starting 0anacron
Oct 18 08:01:01 server1 run-parts[381534]: (/etc/cron.hourly) finished 0anacron
Oct 18 08:01:01 server1 CROND[381518]: (root) CMDEND (run-parts /etc/cron.hourly)
Oct 18 08:12:30 server1 systemd[1]: Reloading nginx - high performance web server...
Oct 18 08:12:30 server1 systemd[1]: Reloaded nginx - high performance web server.

systemctl status はサービスの状態の下に最近のログ 10 行だけを付けて出力するため、それより前のログは journalctl -u で確認します。サービスを systemctl restart で再起動したら、その直後に journalctl -u を実行して起動ログを確認します。

スクリプトや cron ジョブが logger で残したログは、ユニットではなく識別子(タグ)で探します。-t の後ろには logger の -t に書いた名前をそのまま書きます。

logger -t myapp 'journalctl test message'

Debian 12 サーバーで logger は画面に何も出力せず、残した行は -t myapp で探して確認しました。

journalctl -q -t myapp
Oct 28 07:12:44 server2 myapp[347693]: journalctl test message

-g はメッセージに特定の文字列を含む行だけを残します。探す文字列をすべて小文字で書くと大文字・小文字を区別しません。

journalctl -u crond -g anacron -n 2
Oct 28 07:01:01 server1 run-parts[841394]: (/etc/cron.hourly) starting 0anacron

-n は -g で絞り込む前の行数を数えるため、crond の最後の 2 行のうち anacron を含む 1 行だけが残りました。

3️⃣ 時間範囲と起動ごとのログ

--since と --until は出力する時間の始まりと終わりを決めます。日付と時刻の間に空白がある場合はシングルクォートで囲みます。

--since の値意味と使う場面
'2026-10-28 06:00'その日の 06:00:00 から(秒を書かなければ 00 秒)、問題が起きた時刻がわかるとき
today今日の 00:00:00 から、今日のログだけを見るとき
yesterday昨日の 00:00:00 から今まで、昨日 1 日だけを見るなら --until today を一緒に
'-2h'2 時間前から、今起きたことを見るとき(下の実測)
'1 hour ago'1 時間前から、-1h と同じ意味

AlmaLinux サーバーで直近 2 時間は 06:01 に残った crond の行から始まり、下はそのうち最初の 4 行です。

journalctl -u crond --since '-2h' | head -4
Oct 28 06:01:01 server1 CROND[802930]: (root) CMD (run-parts /etc/cron.hourly)
Oct 28 06:01:01 server1 run-parts[802936]: (/etc/cron.hourly) starting 0anacron
Oct 28 06:01:01 server1 CROND[802926]: (root) CMDEND (run-parts /etc/cron.hourly)
Oct 28 07:01:01 server1 CROND[841388]: (root) CMD (run-parts /etc/cron.hourly)

-b は現在の起動以降のログだけを残します。サーバーが再起動した原因を探すときは、以前の起動のログが残っているか起動の一覧から確認します。

journalctl -b -u crond -n 2
Oct 28 07:01:01 server1 run-parts[841394]: (/etc/cron.hourly) starting 0anacron
Oct 28 07:01:01 server1 CROND[841384]: (root) CMDEND (run-parts /etc/cron.hourly)

--list-boots はジャーナルに残っている起動ごとに、番号とブート ID、最初と最後の行の時刻を出力します。

journalctl --list-boots
IDX BOOT ID                          FIRST ENTRY                 LAST ENTRY
  0 4f1c2a9be0d34c7a8e6b5d20c1f3a7e9 Sat 2026-10-17 08:29:26 UTC Wed 2026-10-28 07:16:10 UTC

AlmaLinux サーバーはジャーナルをディスクに置いていないため、起動の記録が 1 つだけでした。そのため以前の起動を指定した -b -1 は案内文だけを残して終わりました。

journalctl -b -1
Specifying boot ID or boot offset has no effect, no persistent journal was found.

以前の起動のログは、ジャーナルをディスク(/var/log/journal)に保存するサーバーでのみ -b -1 で読めます。

4️⃣ journalctl エラーログとカーネルログ

-p はログの重要度レベルで行を選びます。レベルを 1 つ書くとそのレベルとそれより重要なレベルがすべて表示され、レベルは名前と数字のどちらで書いてもかまいません。

レベル数字ベース意味
emerg0システムが使えない状態
alert1すぐに対処が必要な状態
crit2致命的なエラー
err3エラー
warning4警告
notice5正常だが注目すべきこと、-p なしで logger が残した行のレベル
info6情報
debug7デバッグメッセージ

logger で err レベルの行を 1 つ残してから -p err で選ぶと、同じ識別子の notice レベルの行(journalctl test message)は外れ、err の行だけが残りました。

logger -t myapp -p user.err 'journalctl error test'; journalctl -q -t myapp -p err
Oct 28 07:12:46 server2 myapp[347704]: journalctl error test

2 つのレベルをドット 2 つでつなぐと、その範囲だけを出力します。warning..err で選ぶと警告とエラーのレベルだけが残ります。

journalctl -q -t myapp -p warning..err
Oct 28 07:12:46 server2 myapp[347704]: journalctl error test

-k はカーネルメッセージだけを残し、現在の起動以降の行だけを出力します。

journalctl -k -n 3
Oct 26 10:14:25 server1 systemd-rc-local-generator[96245]: /etc/rc.d/rc.local is not marked executable, skipping.
Oct 27 10:47:57 server1 systemd-rc-local-generator[512078]: /etc/rc.d/rc.local is not marked executable, skipping.
Oct 27 11:01:10 server1 systemd-rc-local-generator[520023]: /etc/rc.d/rc.local is not marked executable, skipping.

AlmaLinux サーバーの -k の最後の 3 行はすべて systemd-rc-local-generator の行でした。この行はカーネルログバッファに残したメッセージなので _TRANSPORT の値が kernel として保存され、-k にも一緒に出ます。

5️⃣ journalctl 出力形式

-o は 1 行の形式を変えます。既定値の short は syslog ファイルとほぼ同じ形式で、short-iso は時刻を ISO 8601 形式に変えてタイムゾーンまで付けます。AlmaLinux サーバーで short-iso に変えると、時刻の末尾に +0000 が付きました。

journalctl -u crond -n 2 -o short-iso
2026-10-28T07:01:01+0000 server1 run-parts[841394]: (/etc/cron.hourly) starting 0anacron
2026-10-28T07:01:01+0000 server1 CROND[841384]: (root) CMDEND (run-parts /etc/cron.hourly)

cat は時刻とホスト名をすべて外してメッセージだけを出力するため、メッセージを grep や別のプログラムに渡すときに使います。

journalctl -u crond -n 2 -o cat
(/etc/cron.hourly) starting 0anacron
(root) CMDEND (run-parts /etc/cron.hourly)

json と json-pretty はジャーナルに保存されたフィールドを名前と値で出力します。--output-fields でフィールドを選ぶと、カーソルと時刻、ブート ID のフィールドが常に一緒に付いてきます。Debian 12 サーバーで 4 つのフィールドだけを選んだときも、__CURSOR と _BOOT_ID、2 つの時刻フィールドが一緒に出ました。

journalctl -q -t myapp -n 1 -o json-pretty --output-fields=MESSAGE,PRIORITY,SYSLOG_IDENTIFIER,_PID
{
	"__REALTIME_TIMESTAMP" : "1793171676664200",
	"_PID" : "347877",
	"SYSLOG_IDENTIFIER" : "myapp",
	"MESSAGE" : "follow line 2",
	"__CURSOR" : "s=2a6f0c1d9e8b47a3b5c4d3e2f1a0b9c8;i=1a2b3;b=b7e3d1a04c9f4e2a8d6c5b1f0e2a9c47;m=17cf8fe36f5;t=65ee150cf1188;x=1f2e3d4c5b6a7980",
	"_BOOT_ID" : "b7e3d1a04c9f4e2a8d6c5b1f0e2a9c47",
	"PRIORITY" : "5",
	"__MONOTONIC_TIMESTAMP" : "1636264982261"
}

6️⃣ ジャーナルの保存場所と容量の整理

ジャーナルがメモリにあるかディスクにあるかは、journald.conf の Storage= の値で決まります。既定値の auto は /var/log/journal フォルダーがあればディスクに、なければメモリ(/run/log/journal)に保存します。

🖥️ ログを残す側サービス、カーネル、logger
systemd-journald受け取ったログをジャーナルファイルに保存
/run/log/journalStorage=auto(フォルダーなし)、メモリ、再起動すると消える
/var/log/journalStorage=persistent または auto(フォルダーあり)、ディスク、再起動後も残る
🖥️ journalctl2 つのフォルダーのジャーナルファイルを読んで出力

AlmaLinux サーバーには /var/log/journal フォルダーがなく、ジャーナルは /run/log/journal にだけありました。

ls -ld /var/log/journal /run/log/journal
ls: cannot access '/var/log/journal': No such file or directory
drwxr-sr-x+ 4 root systemd-journal 80 Oct 17 08:30 /run/log/journal

Debian 12 サーバーには両方のフォルダーがあり、ジャーナルはディスクにたまっていました。

ls -ld /var/log/journal /run/log/journal
drwxr-sr-x+ 2 root systemd-journal   40 Oct  9 08:43 /run/log/journal
drwxr-sr-x+ 4 root systemd-journal 4096 Sep 24 12:52 /var/log/journal

再起動後もログを残すには、journald.conf の Storage= を persistent に変えて systemd-journald を再起動します。公式マニュアルによると、/var/log/journal フォルダーは必要なら自動で作られます。この記事では設定を変えていません。

ディスクに残るジャーナルは、事故のあとに取り出して読む飛行機のブラックボックスのようなものです。

--disk-usage は保管されたジャーナルファイルと今使っているファイルを合わせたサイズを出力します。-q で先頭の [Hint] 案内を隠した Debian 12 サーバーの一般アカウントの結果は 6.6M の 1 行でした。

journalctl -q --disk-usage
Archived and active journals take up 6.6M in the file system.

ディスクに保存するジャーナルの最大サイズは SystemMaxUse= で決めます。値を書かなければファイルシステムのサイズの 10%(最大 4G)が上限で、Debian 12 サーバーの journald.conf には 50M と書かれていました。

grep -v '^#' /etc/systemd/journald.conf | grep -v '^$'
[Journal]
SystemMaxUse=50M

古いジャーナルをすぐに減らすときは、--vacuum-size で残すサイズを、--vacuum-time で残す期間を決めます。2 つのコマンドはジャーナルファイルを削除するため、この記事では実行していません。

journalctl --vacuum-size=200M

--vacuum-size=200M は保管されたジャーナルファイルを古いものから削除し、全体のサイズを 200M 以下に減らします。

journalctl --vacuum-time=2weeks

--vacuum-time=2weeks は 2 週間より古い行だけを含む保管ファイルを削除します。

vacuum は保管されたファイルだけを削除し、今使っているファイルは残すため、実行したあとも --disk-usage の数字が指定したサイズまで減らないことがあります。

/var/log の下にテキストログを書く rsyslogは journald とは別に動作します。そのため 2 つのログは読み方も容量の管理方法も異なります。

項目journald(journalctl)rsyslog
読み方journalctlcat, less, grep
保存場所/run/log/journal または /var/log/journal/var/log/messages(RHEL 系)または /var/log/syslog(Debian 系)
容量管理journald.conf の SystemMaxUse などlogrotate

7️⃣ journalctl コマンドの読み取り権限とオプション

  • ↪️ 一般アカウントでログが見えないとき

🔲 読み取り権限

root 以外のアカウントで journalctl を実行すると先頭に [Hint] の文が表示され、そのアカウントが残したログだけが見えます。Debian 12 サーバーの一般アカウントで nginx のログを探すと、案内文のあとに [-- No entries --] だけが表示されました。

journalctl -u nginx -n 5
Hint: You are currently not seeing messages from other users and the system.
      Users in groups 'adm', 'systemd-journal' can see all messages.
      Pass -q to turn off this notice.
-- No entries --

id -nG の結果、このアカウントが属するグループは 1 つだけで、案内文が挙げる adm や systemd-journal グループはありませんでした。

id -nG
user

公式マニュアルは、systemd-journal、adm、wheel グループのアカウントがすべてのジャーナルを読めると説明しています。adm と wheel にはディストリビューションが決めた別の権限も付き、wheel は管理作業までできることが多いため、ログを読むだけのアカウントには systemd-journal グループが合っています。

usermod -aG systemd-journal user

グループを追加する usermod コマンドはこの記事では実行していません。グループを追加したら、もう一度ログインして id -nG でグループを確認します。管理者権限のあるアカウントなら、sudo journalctl で実行してもすべてのログが見えます。

[Hint] の文は -q で隠せます。ただし -q を付けても、見えるログはそのアカウントが残した行だけです。--user はそのアカウントのユーザージャーナルを読み、ジャーナルをディスクに保存するサーバーでのみ動作します。ジャーナルをディスクに置く Debian 12 サーバーでは、そのアカウントの systemd の行と logger の行が表示されました。

journalctl --user -n 3
Oct 28 07:12:35 server2 systemd[347665]: Reached target default.target - Main User Target.
Oct 28 07:12:35 server2 systemd[347665]: Startup finished in 181ms.
Oct 28 07:12:44 server2 myapp[347693]: journalctl test message

🔲 journalctl コマンドのオプション

📌 主なオプション: この記事で実行した結果

オプション作業この記事で確認した結果
-n 行数最後の数行だけを出力、数字を省くと 10 行-n 3 で最後の 3 行が表示
-r順序を逆にして最新の行をいちばん上にcrond ログで最後に残った CMDEND の行がいちばん上
-f最後の行のあとに新しく入る行を出力し続けるlogger で残した 2 行がすぐ下に続く
-q[Hint] などの案内文を隠すDebian 12 一般アカウントの --disk-usage の結果が 6.6M の 1 行だけ
-u ユニットそのサービスのログだけを出力-u を 2 回書くと crond の 4 行のあとに nginx reload の 2 行が時刻順に続く
-t 識別子logger -t で残した識別子のログだけを出力-t myapp で logger が残した行が表示
-g 文字列メッセージにその文字列を含む行だけを出力crond の最後の 2 行のうち anacron を含む 1 行だけが残る
--since, --until出力する時間範囲の始まりと終わり--since '-2h' が 06:01 に残った crond の行から始まる
-b現在の起動以降のログだけ、-b -1 は以前の起動ジャーナルをディスクに置かない AlmaLinux サーバーでは -b -1 は [no persistent journal was found] の案内だけ
--list-bootsジャーナルに残る起動の一覧AlmaLinux サーバーは起動の記録が 1 つだけ
-p レベルその重要度とそれより重要なレベルだけを出力-p err で notice の行は外れて err の行だけ、warning..err も同じ 1 行
-k現在の起動のカーネルメッセージだけを出力最後の 3 行がすべて systemd-rc-local-generator の行
-o 形式1 行の出力形式を変えるshort-iso は時刻の末尾に +0000、cat はメッセージだけが残る
--output-fields フィールドjson 出力でフィールドを選ぶ4 つのフィールドだけを選んでも __CURSOR と _BOOT_ID、2 つの時刻フィールドが一緒に出る
--disk-usageジャーナルファイル全体が占めるサイズを出力Debian 12 サーバーの一般アカウントで 6.6M
--userそのアカウントのユーザージャーナルを読むDebian 12 サーバーでそのアカウントの systemd の行と logger の行が表示
--utc時刻を UTC で出力タイムゾーンを別に設定した AlmaLinux サーバーでも crond ログの時刻が UTC 基準に変わる
フィールド=値そのフィールド値を持つ行だけを出力_PID=347704 で logger が残した err の行 1 つだけが表示

📎 その他のオプション: 公式マニュアルより

オプション作業
--no-pagerless を通さず端末に直接出力
-e, --pager-endless 画面をジャーナルの末尾で開き、-n を書かなければ 1000 行
-x, --catalogメッセージカタログにある説明文をログの行に付け加える
-a, --all出力できない文字がある場合やとても長いフィールドも省略せずに出力
-N, --fieldsジャーナルで使われるフィールド名をすべて出力
-F, --field= フィールドそのフィールドが持つ値をすべて出力
-D フォルダー既定のジャーナルの場所の代わりに指定したフォルダーのジャーナルを読む
--file= ファイル指定したジャーナルファイルを読む、複数回書ける
--vacuum-size= サイズ保管されたジャーナルファイルを古いものから削除して指定したサイズ以下に減らす
--vacuum-time= 期間指定した期間より古い行だけを含む保管ファイルを削除
--vacuum-files= 個数保管されたジャーナルファイルを指定した個数だけ残して削除
--rotate今使っているジャーナルファイルを保管ファイルに回して新しいファイルを始める
--flushメモリ(/run/log/journal)のジャーナルをディスク(/var/log/journal)に移す、persistent 保存のとき

🔲 journalctl コマンドシミュレーター

下のシミュレーターで、最近のログとサービス別ログ、時間範囲、重要度、出力形式を直接入力して確認できます。

journalctl コマンドシミュレーターsystemd 252
[root@server work]#
ブラウザーの中だけで動作し、logger で残した行は再読み込みすると消え、↑↓ で前に使ったコマンドを呼び出せます。

🔢 FAQ & おすすめコンテンツ

--utc を付けると、サーバーのタイムゾーン設定に関係なく時刻を UTC で出力します。タイムゾーンを別に設定した AlmaLinux サーバーでも、--utc を付けた crond ログは時刻が UTC 基準に変わりました。

journalctl _PID=347704 のようにフィールド名と値を等号でつないで書くと、その値の行だけが残ります。logger が残した err の行のプロセス番号で探すとその 1 行だけが表示され、-u と一緒に書くと 2 つの条件を両方満たす行だけを出力します。

🧭 システム情報 · 設定コマンド おすすめコンテンツ 記事 8 · 参照 2
🗂️ システム情報 · 設定コマンド
📄 CPU · RAM · ディスク · OS 情報 📄 uname · カーネルバージョン 📄 free コマンド 📄 uptimeコマンド
📄 timedatectl コマンド 📄 localectl コマンド
📄 logrotate 📄 journalctl コマンド

ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

人間であることを証明してください: 9   +   6   =