Linux、特にサーバー管理を行っていると、必ず「厄介な」問題に遭遇します。サービスが起動しない、アプリケーションが突然停止する、システム全体が原因不明で遅くなるなど。思い通りにいかない時、まず最初にすべきことは「なぜ」を理解することです。そんな時、journalctlやdmesgといった強力なログツールがその威力を発揮します。
この記事では、Linux環境でデバッグするためにこれら2つのツールを効果的に使用する方法を共有します。目的は、特にIT学習を始めたばかりの方々が、サーバー上の問題に直面した際にシステムにアプローチする具体的な方法を学ぶ手助けをすることです。
ログ読み取り方法の比較:従来型、journalctl、dmesg
個々のツールを深く掘り下げる前に、Linuxでログファイルがどのように管理されているか、そしてjournalctlとdmesgが誕生した理由を再確認しましょう。
従来型ログ読み取り方法 (/var/log)
Linuxを始めたばかりの頃、エラーが発生するたびにcd /var/logして、grepを使ってsyslog、auth.log、kern.log、messagesなどのファイルを検索していました。これは基本的な方法ですが、多くの状況で役立ちます。これらのログファイルは通常、rsyslogまたはsyslog-ngによって管理されており、cat、less、tail、grepで簡単に読み取れるプレーンテキストファイルです。
cat /var/log/syslog | grep "error"
tail -f /var/log/nginx/access.log
利点: シンプルで理解しやすく、既存のテキスト処理ツールと連携しやすい。
欠点: ログが分散している(各サービス/ログタイプが個別のファイルにある可能性)、統一された構造がない。これにより、特に大量のログを扱う負荷の高いシステムでは、効率的なフィルタリングと検索が困難になります。
journalctl: Systemdの集中システムログ
最新のinit systemおよびサービス管理システムであるSystemdの登場により、ログ管理の方法は大きく変わりました。journalctlは、集中型ログシステムであるSystemd Journalを読み取り、管理するためのツールです。Systemdは、個別のファイルにログを書き出す代わりに、カーネル、サービス、アプリケーションからログを収集し、バイナリデータベースに記録します。
利点:
- 集中管理: 複数のソースからのすべてのログが単一の場所に集約されます。
- 構造化: ログは構造化された形式で保存されるため、非常に強力かつ迅速なフィルタリングと検索が可能です。
- コンテキストの保持: サービスのログには、そのサービスに関する完全な情報(PID、ユニット名など)が常に付随します。
- ブート固有のサポート: 以前の起動時のログを簡単に確認できます。
- 永続性: ログは、起動をまたいで永続的に保存されるように設定できます。
欠点:
- ログはバイナリ形式で保存されるため、
catやgrepで直接読み取ることができず、journalctlを使用する必要があります。 - 初心者にとっては、
journalctlの構文は多くのオプションがあり、少し「複雑」に感じられるかもしれません。
dmesg: カーネルリングバッファからのメッセージ
dmesg (display message)は、カーネルリングバッファからのメッセージを表示するツールです。これは、オペレーティングシステムカーネルが起動プロセス、ハードウェア認識、ドライバエラー、またはカーネルからのその他の重要なメッセージに関連するイベントを記録する場所です。dmesgのログは、ハードウェア、ドライバの問題、またはシステム起動の非常に早い段階で発生するエラーに遭遇した場合に最初に確認する必要がある情報です。
利点:
- カーネルから直接: ハードウェア、ドライバ、カーネルレベルのエラーに関する重要な情報を提供します。
- 深刻なシステム障害時でも利用可能: カーネルリングバッファからの情報は、他のサービスが安定して動作していなかったり、エラーが発生している場合でも通常アクセスできます。
欠点:
- カーネルからのログのみを表示し、アプリケーションやユーザーサービスのログは含まれません。
- デフォルトでは長期的なログ履歴を保存する機能はありません(リングバッファのコンテンツはいっぱいになると上書きされます)。
- フィルタリングや再フォーマットがされていない場合、出力が読みにくい場合があります。
適切なツールの選択:journalctlとdmesgの使い分け
適切なツールを選択することで、デバッグ時の時間を大幅に節約できます。私は通常、以下のルールを適用しています。
journalctlから始める: WebサーバーNginx、PostgreSQLデータベース、SSHなどのサービス、アプリケーション、または一般的なシステムエラーに関連するほとんどの問題に対しては、journalctlで検索を開始してください。これは最も集中化された豊富なログソースです。- 必要に応じて
dmesgに切り替える:journalctlがカーネル、ハードウェア(例:ハードディスク、ネットワークカード、RAMのエラー)、ドライバに関連するエラーを表示する場合、またはjournalctlが十分な情報を提供しない起動直後からシステムに問題が発生している場合は、dmesgがその威力を発揮する時です。
実践ガイド:journalctlとdmesgによるデバッグ
それでは、各ツールの使用方法を具体的な例とともに詳しく見ていきましょう。
journalctlによるデバッグ
journalctlは非常に柔軟なツールです。以下に、私がよく使用する基本的なコマンドと高度なコマンドを紹介します。
1. 全システムログの表示
Systemd Journalによって収集されたすべてのログを表示するための最もシンプルなコマンドです。
journalctl
結果はlessのようなテキストビューア(ページャー)に表示され、自由にスクロールできます。
2. 最新のログを表示し、リアルタイムで監視する
最新のログを表示し、リアルタイムで到着するログを継続的に監視するには(tail -fと同様):
journalctl -f
このコマンドは、設定変更の影響やサービス再起動後にすぐに確認したい場合に非常に役立ちます。
3. 特定のサービスのログを表示する
サービスが期待通りに動作しない場合、そのサービスの個別のログを確認する必要があります。例えば、Nginxのログを表示するには:
journalctl -u nginx.service
またはSSHサービスの場合:
journalctl -u ssh.service
-fと組み合わせることで、そのサービスのログをリアルタイムで監視できます:journalctl -u nginx.service -f。
4. 時間でログをフィルタリングする
これはjournalctlの最も強力な機能の1つです。開始時刻(--sinceまたは-S)と終了時刻(--untilまたは-U)でログをフィルタリングできます。
1時間前からのログを表示するには:
journalctl -S "1 hour ago"
今日(本日)の初めからのログを表示するには:
journalctl -S "today"
特定の期間のログを表示するには:
journalctl -S "2026-03-24 10:00:00" -U "2026-03-24 10:30:00"
5. 以前の起動時のログを表示する
サーバー再起動後に問題が発生した場合、以前の起動時のログを確認したいと思うかもしれません。
起動リストを表示するには:
journalctl --list-boots
前の起動時のログを表示するには(-1は最新の起動時、-2はその前の起動時):
journalctl -b -1
個人的な経験: 私が管理している4GB RAMのUbuntu 22.04本番サーバーで、再起動後のサービスエラーをデバッグする際にjournalctl -b -1 -u myapp.service -S "20 minutes ago"を使用することで、問題解決にかかる時間を大幅に短縮できました。何百、何千行もの無関係なログを読み飛ばす代わりに、特定の期間におけるそのサービスに必要な情報にすぐに集中することができました。
6. 優先度でフィルタリングする
デバッグ(debug)から緊急アラート(emergency)まで、優先度でログをフィルタリングできます。
エラー(error)のみを表示するには:
journalctl -p err
警告(warning)とエラーのみを表示するには:
journalctl -p warning..err
優先度のレベルは、最も深刻なものから順に:0 (emerg)、1 (alert)、2 (crit)、3 (err)、4 (warning)、5 (notice)、6 (info)、7 (debug) です。
7. ログの永続的な保存を保証する(Persistent Logging)
デフォルトでは、一部のLinuxディストリビューション(Ubuntuなど)では、Systemd JournalはログをRAMに一時的(volatile)にのみ保存します。これは、再起動後にログが失われることを意味します。ログを永続的に保存するには、以下のディレクトリを作成する必要があります。
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald
このディレクトリを作成すると、Systemd Journalは自動的にログを/var/log/journalに保存するようになり、以前の起動時のログをデータを失うことなく確認できるようになります。
dmesgによるデバッグ
dmesgはjournalctlよりも構文はシンプルですが、提供される情報は非常にユニークで特化しています。
1. 全カーネルメッセージの表示
カーネルリングバッファの全コンテンツを表示するための基本的なコマンドです。
dmesg
出力は通常非常に長いため、読みやすくするためにlessまたはgrepと組み合わせるべきです。
dmesg | less
dmesg | grep -i "error"
dmesg | grep -i "usb"
2. -Hオプションで読みやすい形式に整形する
-H (human-readable)オプションを使用すると、dmesgの出力がより明確になり、色付きで比較的理解しやすい時間表示になります。これは私が最もよく使用するオプションです。
dmesg -H
lessと組み合わせると、カーネルログの読み取り体験が格段に向上します。
dmesg -H | less
3. 最新のメッセージを表示する
最新のカーネルメッセージを表示するには、以下のコマンドを使用します。
dmesg --follow
このコマンドは、新しいメッセージがカーネルリングバッファに書き込まれるたびに継続的に表示するため、イベントを直接監視するのに非常に便利です。
4. ハードウェアイベントを確認する
ハードディスク、ネットワークカード、またはUSBデバイスに問題が発生した場合、dmesgが最初に確認すべき場所です。例えば、SATAハードディスクに関連するメッセージを表示するには:
dmesg | grep -i "ata"
またはUSBデバイスについて:
dmesg | grep -i "usb"
結論
journalctlとdmesgを習得することは、プロのシステムエンジニアやDevOpsになるための重要な一歩です。これら2つのツールは、目的と動作が異なりますが、Linuxでの問題診断とトラブルシューティングにおいて互いに非常にうまく補完し合います。journalctlはサービスとアプリケーションの活動に関する包括的で詳細な情報を提供し、dmesgはカーネルレベルでの「目と耳」となり、潜在的なハードウェアの問題を検出するのに役立ちます。
私が紹介したコマンドで定期的に練習してください。Linuxでのデバッグはもはや恐ろしい挑戦ではなく、サーバーをより自信を持って効率的に管理するのに役立つ重要なスキルとなるでしょう。皆様の成功を祈ります!

