log ファイルの読み方 - システムログ解析入門
この記事で解決できること
/var/log/配下のログファイルの構造が分かるtail -f・grep・lessでログを効率よく読めるsyslog・auth.log・kern.logなど代表的なログの違いが分かる- ログのフォーマット(タイムスタンプ・プロセス名・PID)を読み解ける
- 障害対応で使う実践的な調査パターンが身につく
結論(ログ調査の基本型)
- まず
ls /var/log/で対象ファイルを特定する tail -n 100で末尾から確認、リアルタイム監視はtail -fgrepでエラーキーワードを絞り込むlessで前後の文脈をたどる
/var/log ディレクトリとは何か
Linux のシステムログはほぼすべて /var/log/ 以下に集約されている。カーネル・認証・アプリケーションが書き込んだ記録がここにあり、障害対応の出発点になる。
ls /var/log/
auth.log dpkg.log kern.log syslog ubuntu-advantage.log boot.log faillog lastlog ufw.log wtmp
/var/log/ に書き込む主体は syslog デーモン(rsyslog / syslog-ng)と各アプリケーション自身の2種類がある。
代表的なログファイルとその役割とは
/var/log/ 配下には用途別にファイルが分かれており、調査対象を素早く絞り込むためにそれぞれの役割を把握しておく必要がある。
| ファイル | 内容 | 調査用途 |
|---|---|---|
syslog |
システム全般のメッセージ | 原因不明の障害 |
auth.log |
認証・sudo・SSH | 不正ログイン・sudo 失敗 |
kern.log |
カーネルメッセージ | ハードウェア障害・OOM |
dpkg.log |
パッケージ管理履歴 | インストール・更新の追跡 |
ufw.log |
UFW ファイアウォール | 遮断された通信 |
boot.log |
起動時ログ | 起動失敗の原因特定 |
Ubuntu 20.04 以降は syslog が存在しない構成もある。その場合は journalctl でシステムログを確認する。
ログを読むための基本コマンドとは
ログファイルの閲覧には cat / less / tail の3つを状況に応じて使い分けるのが基本だ。
tail — 末尾から読む
# 末尾50行を表示 tail -n 50 /var/log/syslog # リアルタイムで追跡(Ctrl+C で終了) tail -f /var/log/syslog
-f(follow)は障害発生中にログの流れをリアルタイムで監視するときに使う。
less — スクロールして読む
less /var/log/auth.log
less 内での主要操作:
G:末尾へジャンプg:先頭へジャンプ/キーワード:前方検索n:次のマッチへq:終了
cat — 全体を一気に流す(短いファイル向き)
cat /var/log/boot.log
ログが長いファイルに cat を使うと大量出力になるため、通常は less か tail を優先する。
grep でログをフィルタリングする方法とは
長大なログから目的の行を絞り込むには grep を使う。コマンド単体よりも tail や less との組み合わせが実務では多い。
エラー行を抽出する
grep -i "error" /var/log/syslog
-i で大文字小文字を区別しないマッチになる。
複数キーワードで絞り込む
grep -E "error|warn|failed" /var/log/syslog
リアルタイムで grep する
tail -f /var/log/syslog | grep "error"
特定の日付だけ確認する
grep "May 31" /var/log/auth.log
前後の文脈も表示する
grep -A 5 -B 5 "Failed password" /var/log/auth.log
-A 5 はマッチした行の後5行、-B 5 は前5行を表示する。
sudo なしで読めないログファイルがある。Permission denied が出たら sudo less /var/log/kern.log のように実行する。
ログのフォーマットを読み解く方法
syslog 形式のログは固定したフォーマットで書かれており、パターンを知っていると素早く情報を抽出できる。
May 31 10:23:45 myserver sshd[12345]: Failed password for root from 192.168.1.100 port 22 ssh2
| フィールド | 値 | 意味 |
|---|---|---|
| タイムスタンプ | May 31 10:23:45 |
ログが記録された日時 |
| ホスト名 | myserver |
メッセージを発したホスト |
| プロセス名 | sshd |
ログを書き込んだプロセス |
| PID | [12345] |
プロセスID(追跡に使う) |
| メッセージ | Failed password... |
実際のログ内容 |
ログのタイムスタンプはサーバのローカルタイムで記録される。タイムゾーンが UTC の場合、表示と実際の時刻がずれていることに注意する。
よくあるログ調査パターンとは
障害対応でよく使う実践的なパターンを一覧にまとめる。
SSH ログイン失敗を確認する
sudo grep "Failed password" /var/log/auth.log | tail -20
sudo の使用履歴を確認する
sudo grep "sudo" /var/log/auth.log | grep "COMMAND"
カーネルエラーを確認する
sudo grep -i "error\|oops\|panic" /var/log/kern.log | tail -30
パッケージのインストール履歴を確認する
grep " install " /var/log/dpkg.log
直近の起動時エラーを確認する
sudo less /var/log/boot.log
journalctl との使い分け方とは
Ubuntu 16.04 以降、systemd が採用されてから journalctl が主要なログ確認手段となった。/var/log/ のファイルと journalctl は並存する。
| 場面 | 使うべきツール |
|---|---|
| systemd サービスのログ | journalctl -u nginx |
| カーネルメッセージ | journalctl -k |
| 起動時のログ | journalctl -b |
| 伝統的なファイルに書かれたアプリのログ | tail -f /var/log/アプリ.log |
/var/log/auth.log の内容 |
どちらでも可 |
# journalctl でリアルタイム追跡 journalctl -f # 特定サービスのログを tail する journalctl -u nginx -f
journalctl は systemd の journal に蓄積されたログを読む。/var/log/ のテキストファイルとは別の仕組みだが、rsyslog の設定によっては両方に書き込まれることもある。