このレッスンで学ぶこと
システム管理において、ログの監視は重要なタスクです。このレッスンでは:
- ログファイルのリアルタイム監視
- パターンマッチングによる異常検知
- 通知システムの実装
- パフォーマンスを考慮した設計
プロジェクトの要件
ログ監視スクリプトの仕様
-
監視機能
- 複数のログファイルの同時監視
- リアルタイムでの新規行検出
- カスタマイズ可能なパターンマッチング
-
通知機能
- エラーレベルに応じた通知
- 複数の通知方法(メール、ファイル、コンソール)
- 通知の頻度制限
-
管理機能
- 設定ファイルによる管理
- ログローテーション対応
- デーモンモード
ステップ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
実装のポイント
パフォーマンス最適化
-
効率的なファイル読み取り
# tail -F でログローテーションに対応 tail -F "$log_file" | while read -r line; do process_line "$line" done
-
バッファリング
# バッチ処理で効率化 buffer=() while read -r line; do buffer+=("$line") if [ ${#buffer[@]} -ge 100 ]; then process_batch "${buffer[@]}" buffer=() fi done
信頼性の向上
-
状態の永続化
# 読み取り位置の保存 save_state() { echo "$file:$position" > "$STATE_FILE" } # 再起動時の復元 restore_state() { if [ -f "$STATE_FILE" ]; then source "$STATE_FILE" fi }
-
エラー処理
# ファイルアクセスエラーの処理 if [ ! -r "$log_file" ]; then log_error "Cannot read: $log_file" continue fi
拡張性
-
プラグインシステム
# カスタムアクションの読み込み load_plugins() { for plugin in /etc/log_monitor/plugins/*.sh; do [ -f "$plugin" ] && source "$plugin" done }
-
カスタムフィルタ
# ユーザー定義フィルタ 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 を使った継続的な監視
- パターンマッチング: 正規表現による柔軟な検出
- 通知システム: 重複防止とマルチチャンネル対応
- プロダクション対応: 設定管理、エラー処理、拡張性
これらの技術は、システム監視、セキュリティ監査、パフォーマンス分析など、様々な場面で活用できます。
次のステップ
最終レッスンでは、これまでの知識を総合して、システム管理タスクの自動化について学びます。