システムログを自動解析するシェルスクリプト例

― 運用監視を効率化するための実践アプローチ ―

はじめに

Linux サーバ運用において、システムログの監視と解析は障害の早期発見やセキュリティ対策の要です。しかし、/var/log 配下に蓄積されるログを人手で確認し続けるのは現実的ではありません。

本記事では、シェルスクリプト(Bash)を用いてシステムログを自動解析する具体例を紹介します。
特定条件のログ抽出、集計、アラート出力までを一連の流れとして解説します。


対象読者

  • Linux サーバを運用している方
  • cron による定期実行を前提としたログ監視を導入したい方
  • awk / grep / sed などの基本的なコマンドは理解している中級者

解析対象と要件整理

今回は以下のような要件を想定します。

  • 対象ログ:/var/log/syslog または journalctl 出力
  • 検知内容:
    • error, failed, panic を含む行
    • SSH の認証失敗ログ
  • 出力内容:
    • 該当ログの件数
    • 最新の該当ログ数行
  • 実行方式:cron による定期実行を想定

シンプルなログ解析スクリプト例

スクリプト全体像

#!/bin/bash

LOG_FILE="/var/log/syslog"
KEYWORDS="error|failed|panic"
REPORT="/tmp/system_log_report.txt"

echo "=== System Log Report ===" > "$REPORT"
echo "Generated at: $(date)" >> "$REPORT"
echo "" >> "$REPORT"

# エラーログ抽出
MATCHED_LOGS=$(grep -Ei "$KEYWORDS" "$LOG_FILE")

COUNT=$(echo "$MATCHED_LOGS" | wc -l)

echo "Error-related log count: $COUNT" >> "$REPORT"
echo "" >> "$REPORT"
echo "--- Latest logs ---" >> "$REPORT"

echo "$MATCHED_LOGS" | tail -n 10 >> "$REPORT"

スクリプト解説

1. 重要変数の定義

LOG_FILE="/var/log/syslog"
KEYWORDS="error|failed|panic"
  • grep -E による 正規表現 OR 条件を利用
  • 大文字・小文字を区別しないため -i オプションを使用

2. ログ抽出と件数集計

MATCHED_LOGS=$(grep -Ei "$KEYWORDS" "$LOG_FILE")
COUNT=$(echo "$MATCHED_LOGS" | wc -l)
  • 一度変数に格納することで、再利用しやすく可読性も向上

3. レポート形式での出力

tail -n 10
  • 直近のエラーを確認できるよう最新10行のみ表示

SSH 認証失敗ログの解析例

SSH のブルートフォース対策として、以下のような解析も有効です。

grep "Failed password" /var/log/auth.log \
| awk '{print $(NF-3)}' \
| sort | uniq -c | sort -nr

意味

  • IP アドレスごとの失敗回数を集計
  • 異常なアクセス元を即座に把握可能

cron による定期実行設定例

毎日 3:00 に実行する場合

0 3 * * * /usr/local/bin/log_analyze.sh
  • 実運用では ログローテーション(logrotate)との関係に注意
  • 出力結果をメール送信や Slack 通知に拡張するのも有効

実運用での改善ポイント

  • journalctl を利用した systemd 環境対応
  • 前回実行との差分検知
  • exit code による監視ツール連携(Zabbix / Nagios)
  • Python などによる高度な解析への発展

まとめ

シェルスクリプトによるログ自動解析は、低コストかつ即効性のある運用改善手段です。
grep・awk・cron という基本ツールの組み合わせだけでも、十分実用的な監視が構築できます。

まずは小さなスクリプトから導入し、運用に合わせて段階的に高度化していくことをおすすめします。

タイトルとURLをコピーしました