メインコンテンツへスキップ
レッスン 11 / 12推定時間:

実践:ログ監視と通知スクリプト

リアルタイムでログを監視し、異常を検知して通知するスクリプトを作成します

このレッスンで学ぶこと

システム管理において、ログの監視は重要なタスクです。このレッスンでは:

  • ログファイルのリアルタイム監視
  • パターンマッチングによる異常検知
  • 通知システムの実装
  • パフォーマンスを考慮した設計

プロジェクトの要件

ログ監視スクリプトの仕様

  1. 監視機能

    • 複数のログファイルの同時監視
    • リアルタイムでの新規行検出
    • カスタマイズ可能なパターンマッチング
  2. 通知機能

    • エラーレベルに応じた通知
    • 複数の通知方法(メール、ファイル、コンソール)
    • 通知の頻度制限
  3. 管理機能

    • 設定ファイルによる管理
    • ログローテーション対応
    • デーモンモード

ステップ1: 基本的なログ監視

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

ステップ2: 高度なパターンマッチング

#!/bin/bash

# ログレベルの定義
declare -A LOG_LEVELS=(
    [ERROR]=1
    [WARN]=2
    [WARNING]=2
    [INFO]=3
    [DEBUG]=4
)

# パターン設定
declare -A PATTERNS=(
    [error]="ERROR|FATAL|CRITICAL"
    [warning]="WARN|WARNING"
    [security]="unauthorized|failed.*auth|breach|attack"
    [performance]="timeout|slow.*query|high.*load"
)

# パターンマッチング関数
match_patterns() {
    local line="$1"
    local matched=false
    
    for pattern_name in "${!PATTERNS[@]}"; do
        if echo "$line" | grep -E -i "${PATTERNS[$pattern_name]}" >/dev/null; then
            echo "$pattern_name"
            matched=true
        fi
    done
    
    [ "$matched" = false ] && echo "none"
}
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

ステップ3: 通知システムの実装

#!/bin/bash

# 通知設定
NOTIFICATION_METHODS=("console" "file" "email")
NOTIFICATION_LOG="/var/log/monitor_notifications.log"
EMAIL_RECIPIENT="admin@example.com"

# 通知の重複防止
declare -A LAST_NOTIFICATION

# 通知関数
send_notification() {
    local severity="$1"
    local message="$2"
    local method="$3"
    
    # 重複通知の防止(5分間)
    local key="${severity}_${message}"
    local now=$(date +%s)
    local last=${LAST_NOTIFICATION[$key]:-0}
    
    if [ $((now - last)) -lt 300 ]; then
        return
    fi
    
    LAST_NOTIFICATION[$key]=$now
    
    case $method in
        console)
            echo "[ALERT] [$severity] $message" >&2
            ;;
        file)
            echo "$(date '+%Y-%m-%d %H:%M:%S') [$severity] $message" >> "$NOTIFICATION_LOG"
            ;;
        email)
            echo "$message" | mail -s "Log Alert: $severity" "$EMAIL_RECIPIENT"
            ;;
    esac
}
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

ステップ4: 完全なログ監視システム

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

実装のポイント

パフォーマンス最適化

  1. 効率的なファイル読み取り

    # tail -F でログローテーションに対応
    tail -F "$log_file" | while read -r line; do
        process_line "$line"
    done
  2. バッファリング

    # バッチ処理で効率化
    buffer=()
    while read -r line; do
        buffer+=("$line")
        if [ ${#buffer[@]} -ge 100 ]; then
            process_batch "${buffer[@]}"
            buffer=()
        fi
    done

信頼性の向上

  1. 状態の永続化

    # 読み取り位置の保存
    save_state() {
        echo "$file:$position" > "$STATE_FILE"
    }
    
    # 再起動時の復元
    restore_state() {
        if [ -f "$STATE_FILE" ]; then
            source "$STATE_FILE"
        fi
    }
  2. エラー処理

    # ファイルアクセスエラーの処理
    if [ ! -r "$log_file" ]; then
        log_error "Cannot read: $log_file"
        continue
    fi

拡張性

  1. プラグインシステム

    # カスタムアクションの読み込み
    load_plugins() {
        for plugin in /etc/log_monitor/plugins/*.sh; do
            [ -f "$plugin" ] && source "$plugin"
        done
    }
  2. カスタムフィルタ

    # ユーザー定義フィルタ
    apply_custom_filters() {
        local line="$1"
        for filter in "${CUSTOM_FILTERS[@]}"; do
            if ! eval "$filter \"$line\""; then
                return 1
            fi
        done
        return 0
    }

統合テスト

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

まとめ

このレッスンでは、実用的なログ監視システムの構築を通じて:

  • リアルタイム監視: tail -f を使った継続的な監視
  • パターンマッチング: 正規表現による柔軟な検出
  • 通知システム: 重複防止とマルチチャンネル対応
  • プロダクション対応: 設定管理、エラー処理、拡張性

これらの技術は、システム監視、セキュリティ監査、パフォーマンス分析など、様々な場面で活用できます。

次のステップ

最終レッスンでは、これまでの知識を総合して、システム管理タスクの自動化について学びます。

さらに学習を続けるには

素晴らしい学習ペースです!次のレッスンに進むには、無料会員登録をお願いします。無料会員では各コース3レッスンまで学習できます。

無料で続きを学ぶ

各コース3レッスンまで学習可能

学習進捗の自動保存

コース修了証明書の発行