🐧 Linux 総合学習プラットフォーム
プロセス監視/障害対応 ・ 中級

ログの調査(journalctl・dmesg)

障害の原因はログに残っていることが多く、現象を把握したら真っ先に確認します。systemd環境では journalctl で各サービスのログを横断的に読めます。-u でサービスを絞り、-b で今回の起動分だけ、-f で新しい行を追尾できます。dmesg はカーネルからのメッセージを表示し、ハードウェアの異常やOOM Killerによるプロセス強制終了、ディスクエラーなどの低レベルな手がかりが見つかります。

障害対応で最も頼りになる情報源はログだ。

システムやサービスは、起動・停止・エラー・警告といった出来事を逐一ログに書き残しており、障害の原因はたいていそこに痕跡を残している。

💡
ポイント困ったらまずログ。機械は自分の異常を逐一書き残している。推測で触る前に「機械自身が何を訴えているか」を読みに行く。

現象を把握したら、リソースを調べるより前に、まずログを確認するのが定石だ。推測であれこれ触る前に、「機械自身が何を訴えているか」を読みに行く。この習慣があるだけで、原因究明のスピードが段違いになる。

ここでは、systemd環境の中心となる journalctl と、カーネルからの低レベルなメッセージを見る dmesg を押さえる。

nginxsshd各サービスjournald一元的に集約journalctl串刺しで読むどのサービスも同じコマンド・同じ操作で横断的に読める

📚 journalctl 一つで全サービスを横断する

近年の多くのLinuxは、systemdがOS全体の起動やサービスを管理している。各サービスのログは journald という仕組みに一元的に集約される。これを読み出すのが journalctl だ。

引数なしで journalctl を実行すると、すべてのログが時系列で表示されるが、量が膨大なので、実務では必ず条件で絞り込む。

表示は less と同じ操作(スペースで進む、/ で検索、q で終了)で読め、新しいログは末尾にある。

journald に集約されているおかげで、どのサービスのログも同じコマンド・同じ操作で串刺しに読めるのが大きな利点だ。

もっともよく使う絞り込みが、-u によるサービス単位の指定だ。journalctl -u nginx とすれば nginx サービスのログだけが表示され、そのサービスの起動失敗やエラーを追える。

journalctl -u nginx -p err --since today ……「今日の nginx のエラーだけ」を一発で抜き出す。条件を重ねるほど対象が狭まる。

さらに -b を付けると、現在の起動(ブート)以降のログだけに絞れる(journalctl -b)。-b -1 とすれば1つ前の起動時のログを見られるので、「再起動の直前に何が起きたか」を調べたいときに有効だ。

リアルタイムに追尾したいときは -f を使い、journalctl -u nginx -f とすると、新しいログ行が書き込まれるたびに画面へ流れ続ける。サービスを操作しながらログの動きを目で追う、いわゆるログ監視の定番だ。

そのほかの絞り込みも組み合わせられる。時刻で絞る --since と --until(journalctl --since "2026-06-27 14:00" のように指定)、深刻度で絞る -p err(エラー以上だけ表示)、新しい順に並べる -r、表示行数を絞る -n 50 などだ。

これらを組み合わせると、膨大なログから目的の数行へ素早くたどり着ける。たとえば journalctl -u nginx -p err --since today とすれば、「今日の nginx のエラーだけ」を一発で抜き出せる。

コツ絞り込みは「まず広く出してから -u・-p・--since を足す」と迷わない。条件を重ねるほど対象が狭まり、目的の数行へ素早く着く。

これらの絞り込みは複数を同時に指定でき、条件を重ねるほど対象が狭まる。まず広く出してから -u・-p・--since を足して絞っていくと迷わない。

ひとつ注意したいのが、journald のログが再起動をまたいで残るかどうかは設定によるという点だ。

既定では揮発(メモリ上のみ)で、再起動すると消える環境もある。その場合は journalctl -b -1 で前回起動分を見ようとしても残っていない。

つまずきjournald は既定で揮発(メモリ上のみ)の環境がある。再起動でログが消えると後追いできない。本番では永続化を先に済ませる。

過去の障害を後から追えるよう永続化したいときは、/var/log/journal/ ディレクトリを作成しておくと、ログがディスクに保存されるようになる。

本番サーバでは、原因調査を後追いできるよう、この永続化を最初に済ませておくと安心だ。ログがいつまで残るかは、ディスク容量に応じて journald が古いものから自動で間引く点も覚えておく。

🔧 サービス層より深い「カーネルの声」

journalctl がサービス層のログを扱うのに対し、より低い階層であるカーネルからのメッセージを表示するのが dmesg(diagnostic message)だ。

ハードウェアの認識・エラー、ドライバの読み込み、ディスクの異常といった、OSの土台で起きていることがここに出る。

dmesg -T ……各行に人間が読める時刻を付ける(既定は起動からの経過秒数で読みにくい)。dmesg | less でページ送り。

dmesg は出力が多いので、扱いやすくする工夫がある。dmesg | less でページ送りしたり、dmesg -T で各行に人間が読める時刻を付けたり(既定は起動からの経過秒数で読みにくい)、dmesg -w で新着を追尾したりできる。

systemd環境では journalctl -k でも同じカーネルメッセージを読める。

💥 アプリが理由もなく落ちた、その痕跡

dmesg がとくに威力を発揮するのが、メモリ枯渇による障害の調査だ。

Linuxは物理メモリとスワップを使い果たすと、システム全体が固まるのを防ぐため、カーネルが自動的に「メモリを大量に使っているプロセスを1つ選んで強制終了する」という最終手段に出る。これが OOM Killer(Out Of Memory Killer)だ。

🔗
たとえOOM Killer は満員のボートで「全員沈むより1人下りて」と選ぶ役。メモリ枯渇でシステム全体が固まるのを防ぐための最終手段だ。

アプリが理由もなく突然落ちていたら、まずこれを疑う。

OOM Killer が動くと、dmesg や journalctl に Out of memory: Killed process 12345 (java) のような行が残る。これを見つければ「そのプロセスがメモリ不足で殺された」と断定できる。

dmesg | grep -i oom ……OOM Killer の痕跡を素早く探す。journalctl -k | grep -i oom でも同じ。Killed process の行が出れば確定。

dmesg | grep -i oom や journalctl -k | grep -i oom で素早く痕跡を探せる。

原因が分かれば、対処はメモリ増設、該当プロセスのメモリ使用量の見直し、スワップの調整などへと進められる。

🧭 2つの道具を症状に応じて使い分ける

実際の調査では、症状に応じて使い分ける。

特定のサービスが起動しない・エラーを返すなら journalctl -u サービス名 -p err でそのサービスのエラーを確認する。サーバ全体が不安定・突然プロセスが落ちる・ハードウェアが怪しいなら dmesg -T でカーネルの異常やOOM Killerの痕跡を探す。

リアルタイムに事象を捕まえたいときは journalctl -f や dmesg -w を回しながら問題の操作を再現する。

ログは新しい行が末尾に追記されるので、調査では tail で末尾だけ見るのと同じ感覚で、最新の出来事から遡るのが効率的だ。

「困ったらまずログ」を徹底し、journalctl と dmesg を使い分けられるようになると、原因不明に見えた障害の多くが、実は明確な手がかりを残していたと気づけるはずだ。

この項目に出てくる用語

ジャーナル(ログ)じゃーなる
systemdが一元管理するログ。journalctl で横断的に読める。
OOM(メモリ不足)おーおーえむ
メモリ枯渇時にカーネルがプロセスを強制終了する仕組み(OOM Killer)。

関連コマンド

journalctldmesgtail

▶ 学習アプリでこの続きを学ぶ・演習する