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 3Oct 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 user1 行は時刻、ホスト名、ログを残したプログラムとプロセス番号、メッセージの順で構成されます。-r を付けると順序が逆になり、最新の行がいちばん上に来ます。AlmaLinux サーバーの crond ログでは、最後に残った CMDEND 行がいちばん上でした。
journalctl -r -u crond -n 3Oct 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 myappOct 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 4Oct 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 myappOct 28 07:12:44 server2 myapp[347693]: journalctl test message-g はメッセージに特定の文字列を含む行だけを残します。探す文字列をすべて小文字で書くと大文字・小文字を区別しません。
journalctl -u crond -g anacron -n 2Oct 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 -4Oct 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 2Oct 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-bootsIDX BOOT ID FIRST ENTRY LAST ENTRY
0 4f1c2a9be0d34c7a8e6b5d20c1f3a7e9 Sat 2026-10-17 08:29:26 UTC Wed 2026-10-28 07:16:10 UTCAlmaLinux サーバーはジャーナルをディスクに置いていないため、起動の記録が 1 つだけでした。そのため以前の起動を指定した -b -1 は案内文だけを残して終わりました。
journalctl -b -1Specifying boot ID or boot offset has no effect, no persistent journal was found.以前の起動のログは、ジャーナルをディスク(/var/log/journal)に保存するサーバーでのみ -b -1 で読めます。
4️⃣ journalctl エラーログとカーネルログ
-p はログの重要度レベルで行を選びます。レベルを 1 つ書くとそのレベルとそれより重要なレベルがすべて表示され、レベルは名前と数字のどちらで書いてもかまいません。
| レベル | 数字ベース | 意味 |
|---|---|---|
| emerg | 0 | システムが使えない状態 |
| alert | 1 | すぐに対処が必要な状態 |
| crit | 2 | 致命的なエラー |
| err | 3 | エラー |
| warning | 4 | 警告 |
| notice | 5 | 正常だが注目すべきこと、-p なしで logger が残した行のレベル |
| info | 6 | 情報 |
| debug | 7 | デバッグメッセージ |
logger で err レベルの行を 1 つ残してから -p err で選ぶと、同じ識別子の notice レベルの行(journalctl test message)は外れ、err の行だけが残りました。
logger -t myapp -p user.err 'journalctl error test'; journalctl -q -t myapp -p errOct 28 07:12:46 server2 myapp[347704]: journalctl error test2 つのレベルをドット 2 つでつなぐと、その範囲だけを出力します。warning..err で選ぶと警告とエラーのレベルだけが残ります。
journalctl -q -t myapp -p warning..errOct 28 07:12:46 server2 myapp[347704]: journalctl error test-k はカーネルメッセージだけを残し、現在の起動以降の行だけを出力します。
journalctl -k -n 3Oct 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-iso2026-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)に保存します。
AlmaLinux サーバーには /var/log/journal フォルダーがなく、ジャーナルは /run/log/journal にだけありました。
ls -ld /var/log/journal /run/log/journalls: cannot access '/var/log/journal': No such file or directory
drwxr-sr-x+ 4 root systemd-journal 80 Oct 17 08:30 /run/log/journalDebian 12 サーバーには両方のフォルダーがあり、ジャーナルはディスクにたまっていました。
ls -ld /var/log/journal /run/log/journaldrwxr-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-usageArchived 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 |
|---|---|---|
| 読み方 | journalctl | cat, 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 5Hint: 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 -nGuser公式マニュアルは、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 3Oct 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-pager | less を通さず端末に直接出力 | |
| -e, --pager-end | less 画面をジャーナルの末尾で開き、-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 コマンドシミュレーター
下のシミュレーターで、最近のログとサービス別ログ、時間範囲、重要度、出力形式を直接入力して確認できます。
🔢 FAQ & おすすめコンテンツ






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

