7.

Linux ログ確認の便利なコマンド集 — tail/journalctl/grep/less

編集
この記事の要点
  • リアルタイム監視: tail -f /var/log/syslog / journalctl -f -u nginx / less +F
  • 検索: grep ERROR /var/log/app.log、複数: grep -E "ERROR|FATAL"、前後: grep -A 3 -B 1
  • 圧縮ログ: zcat /var/log/syslog.1.gz / zless / zgrep PATTERN
  • 主要ログの場所: /var/log/syslog (Debian系), /var/log/messages (RHEL系), /var/log/auth.log, /var/log/secure, dmesg (kernel)
  • systemd 環境では journalctl: -u SERVICE -f --since "1 hour ago"、Docker は docker logs -f container

Linux ログ確認の全体像

Linux でトラブルシューティングする上で「ログを見る力」は基礎中の基礎です。OS 全体のログ (syslog/journal)、認証 (auth)、カーネル (dmesg)、各アプリ (nginx/mysql/php-fpm)、Docker など、ログの所在と確認コマンドを知っておくと、原因特定の速度が桁違いになります。

主要ログファイルの場所

パス内容OS
/var/log/syslogシステム全般Debian / Ubuntu
/var/log/messagesシステム全般RHEL / CentOS / AlmaLinux
/var/log/auth.log認証 (SSH/sudo)Debian / Ubuntu
/var/log/secure認証RHEL系
/var/log/kern.logカーネルDebian / Ubuntu
/var/log/dmesg起動メッセージ全般
/var/log/nginx/access.lognginx アクセス全般
/var/log/nginx/error.lognginx エラー全般
/var/log/mysql/error.logMySQL エラー全般
/var/log/cron / cron.logcron 実行記録全般

tail: リアルタイム監視の定番

# 末尾 10 行
tail /var/log/syslog

# 末尾 100 行
tail -n 100 /var/log/syslog

# リアルタイム監視 (新しい行が来るたび追記表示)
tail -f /var/log/syslog

# 複数ファイル同時監視
tail -f /var/log/nginx/access.log /var/log/nginx/error.log

# ファイルが消えて作り直されても追跡 (logrotate 対応)
tail -F /var/log/syslog

# パイプで grep
tail -F /var/log/app.log | grep --line-buffered ERROR

less: 検索と巻き戻しが効く

# less でログを開く
less /var/log/syslog

# 操作キー
#   /word        前方検索
#   ?word        後方検索
#   n            次の一致
#   N            前の一致
#   G            末尾へ
#   g            先頭へ
#   F            tail -f 風 (Ctrl-C で停止)
#   q            終了

# 末尾から開いて tail -f 風に
less +F /var/log/syslog
# Ctrl-C → 通常の less 操作 → F で再び tail モード

grep: 検索の基本

# 単純検索
grep ERROR /var/log/app.log

# 大文字小文字無視
grep -i error /var/log/app.log

# 行番号表示
grep -n ERROR /var/log/app.log

# 前後行も表示
grep -A 3 -B 1 ERROR /var/log/app.log     # 後 3 行 + 前 1 行
grep -C 2 ERROR /var/log/app.log          # 前後 2 行

# 複数パターン (拡張正規表現)
grep -E "ERROR|FATAL|CRITICAL" /var/log/app.log

# 除外
grep -v "DEBUG" /var/log/app.log

# 再帰的に
grep -r ERROR /var/log/

# 件数だけ
grep -c ERROR /var/log/app.log

# マッチしたファイル名だけ
grep -l ERROR /var/log/*.log

# 単語境界 (warn は含めず warning だけ)
grep -w warning /var/log/app.log

journalctl: systemd のログ

# 全ジャーナル
journalctl

# 末尾から表示 (-e は less の最終行へ)
journalctl -e

# サービス単位
journalctl -u nginx
journalctl -u nginx -u mysql      # 複数

# リアルタイム監視
journalctl -u nginx -f

# 期間指定
journalctl --since '1 hour ago'
journalctl --since '2026-05-17 10:00' --until '2026-05-17 12:00'
journalctl --since today
journalctl --since yesterday

# 起動以降
journalctl -b              # 今回起動
journalctl -b -1           # 前回起動

# 優先度
journalctl -p err          # err 以上 (emerg/alert/crit/err)
journalctl -p warning..err # warning から err まで

# プロセス / ユーザ
journalctl _PID=1234
journalctl _UID=1000

# カーネルメッセージのみ
journalctl -k

圧縮ログの確認

logrotate で .1.gz / .2.gz などに圧縮されたログは z 系コマンドで展開せず読めます:

# 圧縮ログ閲覧
zcat /var/log/syslog.1.gz | less

# 圧縮ログを less で
zless /var/log/syslog.1.gz

# 圧縮ログを grep
zgrep ERROR /var/log/syslog.*.gz

# 末尾だけ
ztail -100 /var/log/syslog.1.gz    # 一部ディストリのみ
# 代替: zcat ... | tail -n 100

dmesg: カーネルメッセージ

# 起動時のメッセージ + USB 接続等
dmesg

# タイムスタンプを人間可読に
dmesg -T

# リアルタイム
dmesg -w
dmesg -wH    # human-readable

# レベル指定
dmesg --level=err,warn

# Out Of Memory (OOM Killer) の発動履歴
dmesg | grep -i "out of memory"
dmesg | grep -i killed

nginx / apache のログ

# アクセスログ末尾を監視
tail -f /var/log/nginx/access.log

# ステータスコード 5xx だけ
awk '$9 ~ /^5/' /var/log/nginx/access.log | tail

# URL 別のアクセス数 TOP 10
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head

# IP 別アクセス数 TOP 10
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head

# 5xx エラーの URL 一覧
grep ' 5[0-9][0-9] ' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c

Docker のログ

# コンテナ起動以降のログ全て
docker logs CONTAINER

# 末尾 100 行
docker logs --tail 100 CONTAINER

# リアルタイム監視
docker logs -f CONTAINER

# タイムスタンプ + 期間
docker logs --since 1h --timestamps CONTAINER

# docker compose 全サービス
docker compose logs -f
docker compose logs -f nginx app

logrotate

ログが無限に肥大化しないよう、Linux では logrotate が日次でローテーションします:

# 設定確認
cat /etc/logrotate.conf
ls /etc/logrotate.d/

# /etc/logrotate.d/nginx 例
# /var/log/nginx/*.log {
#     daily
#     missingok
#     rotate 14
#     compress
#     delaycompress
#     notifempty
#     create 0640 www-data adm
#     sharedscripts
#     postrotate
#         [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
#     endscript
# }

# 手動でテスト実行 (反映せず)
sudo logrotate -d /etc/logrotate.d/nginx

# 強制実行
sudo logrotate -f /etc/logrotate.d/nginx

systemd-journald の設定

# /etc/systemd/journald.conf を編集
sudo vi /etc/systemd/journald.conf
# [Journal]
# Storage=persistent           # 永続化
# SystemMaxUse=1G              # 最大 1GB
# SystemMaxFileSize=100M
# MaxRetentionSec=2week        # 2 週間で削除

# 反映
sudo systemctl restart systemd-journald

# ディスク使用量確認
journalctl --disk-usage

# 古いログを削除
sudo journalctl --vacuum-time=7d     # 7 日より古い
sudo journalctl --vacuum-size=500M   # 500MB を超える分

FAQ

Q: tail -f と journalctl -f どちらを使う?
A: systemd 管理のサービスは journalctl -u SERVICE -f 推奨 (構造化ログ、フィルタが豊富)。アプリが自前のファイルに書き出すなら tail -f

Q: ログが英語で読めない
A: ERROR/WARN/INFO/DEBUG レベルと、Stack Trace / Exception / Connection refused 等のキーワードを覚えるだけで 8 割解読できる。

Q: 大量のログから「いつから起きているか」を見たい
A: grep ERROR app.log | head で最初のエラー、grep ERROR app.log | tail で最新。期間指定なら journalctl --since

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ディストリビューション
  2. コマンド一覧
  3. ユーザー一覧の確認
  4. リポジトリの一覧の確認
  5. エラー一覧
  6. ショートカットキー一覧
  7. ログを確認する便利なコマンド
  8. cronの導入と実行方法 (CentOS 7編)
  9. ディレクトリ内のファイル数を確認
  10. 複数ファイル内の文字列を一括置換する方法