ログファイルの解析
このレッスンで分かること
- ログ解析は
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 でフィールド抽出する手もありますが、まずはテキスト処理の基本パターンを身につけるのが先決です。
解析の基本フロー
図の流れを順序リストで書き直すと、次の通りです。
- ログファイルを開く
grepで対象キーワードを含む行に絞るawkで必要なフィールド (列) だけ取り出すsort | uniq -cで同値を数える (sort 必須)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 -lawk '$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 つができることを確認しましょう。
- ログ解析 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. ログ解析 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- grep を使って ERROR 行をカウントする
- 結果として 3 のみを出力する