ログファイルの解析

このレッスンで分かること

  • ログ解析は grep (絞る) → awk (切り出す) → sort | uniq -c (数える) の 3 ステップ
  • 上位 IP 集計の定型句は awk '{print $1}' | sort | uniq -c | sort -rn | head
  • systemd 系では journalctl を使い、リアルタイムは tail -f | grep --line-buffered

ログファイルの解析 とは

ログファイルの解析方法を学習します。エラーやシステムの状態把握に役立てましょう。本レッスンでは、ログファイルの解析 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

サーバーやアプリの調子がおかしいとき、最初に開くのはログです。Web サーバーのアクセスログ、アプリの error.log、auth.log、journald のシステムログなど、Linux 上のあらゆるソフトウェアは「何が起きたか」を文字列で記録しています。ここから原因を引き当てる作業はエンジニアの基礎体力であり、SRE や運用エンジニアだけでなく、アプリ開発者にも必須のスキルです。

ログ解析というと専用ツールを思い浮かべがちですが、grep awk sort uniq wc を組み合わせるだけで「特定エラーが何件出ているか」「どの IP からのリクエストが多いか」「直近 1 時間のエラー率は」といった集計が即座に取れます。本レッスンではこの 5 コマンドを実例で繋ぎ、ログから情報を抽出する型を身につけます。

ログの典型フォーマット

まず Apache / Nginx の access.log を例にします。1 行に複数のフィールドがスペース区切りで並んでいます。

ターミナル

# 例: アクセスログ 1 行 # 192.168.1.10 - - [19/May/2026:09:12:33 +0900] "GET /api/users HTTP/1.1" 200 1234

アプリのログは JSON Lines (1 行 1 JSON) で出ることも増えており、jq でフィールド抽出する手もありますが、まずはテキスト処理の基本パターンを身につけるのが先決です。

解析の基本フロー

diagram (will load when visible)

図の流れを順序リストで書き直すと、次の通りです。

  1. ログファイルを開く
  2. grep で対象キーワードを含む行に絞る
  3. awk で必要なフィールド (列) だけ取り出す
  4. sort | uniq -c で同値を数える (sort 必須)
  5. sort -rn | head で多い順に上位を取る

左から右に流すパイプラインです。grep で対象行を絞り、awk でほしい列だけ取り出し、sort と uniq -c で件数を数え、最後に多い順に並べ替える。この一連の流れがログ解析の型です。

代表例 1 エラー件数を数える

ターミナル

# error という単語を含む行の件数 grep -c error /var/log/app.log # 例: 47

-c で行数を返します。-i を加えると大文字小文字を無視できます。本番では grep -c -i 'error\|fatal\|critical' app.log のように複数キーワードをまとめて数えることが多いです。

代表例 2 上位 IP を集計する

ターミナル

# アクセスログから IP (1 列目) を抽出し、件数の多い順 TOP5 awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -5

この 1 行で次の処理を一気にこなしています。

  • awk で 1 列目 (IP) のみ取り出し
  • sort で IP をソート (uniq -c は隣り合う同値を数えるので事前 sort が必須)
  • uniq -c で件数付きユニーク化
  • sort -rn で数値降順
  • head -5 で上位 5 件

代表例 3 ステータスコード別の集計

ターミナル

# 9 列目がステータスコード awk '{print $9}' access.log | sort | uniq -c | sort -rn # 例: 12340 200 # 521 404 # 18 500

運用ではこの集計を毎分回し、500 系が急増していないかを監視に使います。

時間帯で絞り込む

ターミナル

# 09 時台のログだけ抜き出して 5xx を数える grep '19/May/2026:09:' access.log | awk '$9 ~ /^5/ {print}' | wc -l

awk '$9 ~ /^5/' はステータス列が 5 で始まる行を意味する正規表現マッチで、500 系すべてを拾えます。

ログ解析は「絞る (grep) → 切り出す (awk) → 数える (sort/uniq -c)」の 3 ステップを覚えるだけで 8 割の場面に対応できます。複雑な集計はこの 3 ステップを連結しているだけです。

tail -f でリアルタイム監視

ターミナル

# 末尾を追い続け、error が出たらすぐ知る tail -f /var/log/app.log | grep --line-buffered error

--line-buffered を付けないと、grep の出力がバッファされてリアルタイムに見えないことがあります。

journald と systemd 系

最近のディストロでは journalctl でシステムログを引きます。

ターミナル

# 直近のエラー以上だけ表示 journalctl -p err -n 50 # 特定サービスの最新ログを追う journalctl -u nginx -f

古い記事には tail -f /var/log/messages/var/log/syslog が頻出しますが、systemd 化されたディストロでは journald に集約されているため journalctl の使い方を覚えておくのが現代的です。

よくある間違い

  • uniq -c の前に sort を入れ忘れて件数が出ない
  • awk の列番号がフォーマットによってずれる (空白とタブが混在するときは awk -F'\t' で明示)
  • 大きなログを cat | grep する (cat なしで grep ... file の方が速い)
  • 圧縮済みログには zcat / zgrep を使う必要がある

やってみよう

演習ではログのサンプルを echo で作って、grep / awk / sort / uniq -c を組み合わせ、エラー件数の集計を行います。

この章のポイント

ここまでの要点 grep | awk | sort | uniq -c | sort -rn | head の 3 段。uniq -c の前に sort 必須。圧縮ログは zgrep、systemd は journalctl

まとめ

  • grep で行を絞り、awk で列を切り出し、sort + uniq -c で集計するのがログ解析の基本型
  • アクセスログでは「上位 IP」「ステータスコード別件数」「時間帯フィルタ」がよく使う集計
  • systemd 系ディストロでは journalctl が事実上の標準
  • リアルタイム監視は tail -f + grep、ただし --line-buffered を忘れない
  • 圧縮ログには zgrep / zcat を使う

次のレッスン

次は システム情報の取得 で、稼働中のシステムの状態(CPU・メモリ・ディスク・プロセス等)の調べ方を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. ログ解析 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. ログ解析 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. grep を使って ERROR 行をカウントする
  2. 結果として 3 のみを出力する

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力