コンテンツにスキップ

Centralized Logging System

[!NOTE] 最新の実装状況は 機能実装ステータス (Remaining Functionality) を参照してください。

集中ログシステムの実装。ELK Stack (Elasticsearch + Logstash + Kibana) を使用した包括的なログ管理とリアルタイム監視を提供します。

実装完了日: 2026年1月22日
最終更新日: 2026年1月23日(Elasticsearch接続修正、ログビューアUI強化)
Author: Masahiro Aoki
Copyright: 2026 Moonlight Technologies Inc. All Rights Reserved.

概要

このシステムは、EvoSpikeNetの分散脳シミュレーション環境における全ノードのログを集中管理し、以下の機能を提供します:

  • ログ収集: Fluent BitとLogstashによる自動ログ収集
  • ログストレージ: Elasticsearchによる高速検索可能なログストレージ
  • ログ可視化: Kibanaによる強力なログ分析UI
  • リアルタイム監視: WebSocketベースのリアルタイムログストリーミング
  • 異常検知: エラースパイク、繰り返しエラー、ノード障害の自動検出
  • パターン認識: ログパターンの自動抽出と分類
  • アラート: 重要なイベントの自動通知
  • ログ永続化: S3/GCSへの長期保存

アーキテクチャ

┌─────────────────────────────────────────────────────────────┐
│                   EvoSpikeNet Nodes                         │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐                 │
│  │  Node 0  │  │  Node 1  │  │  Node N  │                 │
│  │  (PFC)   │  │ (Visual) │  │ (Motor)  │                 │
│  └─────┬────┘  └─────┬────┘  └─────┬────┘                 │
│        │             │             │                        │
│        └─────────────┼─────────────┘                        │
│                      │                                      │
│              JSON Logs to Files                             │
│                      ↓                                      │
└──────────────────────┼──────────────────────────────────────┘
                       │
         ┌─────────────┴─────────────┐
         │                           │
    ┌────▼────┐              ┌───────▼──────┐
    │ Fluent  │              │   Logstash   │
    │  Bit    │──────────────→              │
    └────┬────┘              └───────┬──────┘
         │                           │
         └───────────┬───────────────┘
                     │
              ┌──────▼───────┐
              │              │
              │ Elasticsearch│
              │              │
              └──────┬───────┘
                     │
         ┌───────────┴───────────┐
         │                       │
    ┌────▼────┐          ┌───────▼──────┐
    │ Kibana  │          │ Log Viewer   │
    │   UI    │          │  (Frontend)  │
    └─────────┘          └──────────────┘

インストール

必要なパッケージ

# Python依存関係
pip install elasticsearch boto3 google-cloud-storage

# Docker環境の場合
cd docker/logging
./start-elk.sh

# Kubernetes環境の場合
kubectl apply -f k8s/logging/logging-stack.yaml

Elasticsearch接続確認

curl http://localhost:9200/_cluster/health

使用方法

1. ログシステムの初期化

try:
   from evospikenet.logging import CentralizedLogger, CentralizedLoggerConfig, setup_centralized_logging
except Exception:
   CentralizedLogger = None
   CentralizedLoggerConfig = None
   setup_centralized_logging = None

# 設定
config = None
if CentralizedLoggerConfig is not None:
   config = CentralizedLoggerConfig(
      elasticsearch_hosts=["http://localhost:9200"],
      elasticsearch_index="evospikenet-logs",
      enable_elasticsearch=True,
      enable_file_output=True,
      log_directory="/var/log/evospikenet",
      buffer_size=1000,
      flush_interval=5.0,
   )

# ロガー作成(ガード付き)
logger = None
if CentralizedLogger is not None and config is not None:
   try:
      logger = CentralizedLogger(config)
   except Exception:
      logger = None
elif setup_centralized_logging is not None and config is not None:
   try:
      logger = setup_centralized_logging(config)
   except Exception:
      logger = None

if logger is None:
   print("Centralized logging not initialized in this environment. See docs for deployment notes.")

2. 標準loggingモジュールとの統合

# Integrate with standard logging (guarded)
try:
   from evospikenet.logging import setup_centralized_logging
except Exception:
   setup_centralized_logging = None

if setup_centralized_logging is not None:
   logger = setup_centralized_logging(
      logger_name="evospikenet.node0",
      node_id="pfc-0",
   )
   logger.info("Node started successfully")
   logger.error("Connection failed", extra={"context": {"host": "192.168.1.1"}})
else:
   import logging
   logging.getLogger("evospikenet.node0").info("Fallback: local logging only")

3. フロントエンドでログ閲覧

# Dashアプリケーション起動
python frontend/app.py

ブラウザで http://localhost:8050/log-viewer にアクセス

4. Kibanaでログ分析

  1. ブラウザで http://localhost:5601 を開く
  2. 「Discover」に移動
  3. インデックスパターン evospikenet-logs-* を作成
  4. タイムフィールドに @timestamp を選択
  5. ログの検索、フィルタリング、可視化

機能詳細

Phase 1: ログ収集基盤

JSON形式構造化ログ

すべてのログはJSON形式で出力されます:

{
  "@timestamp": "2026-01-22T10:30:45.123Z",
  "level": "INFO",
  "message": "Processing completed",
  "logger": "evospikenet.pfc",
  "module": "pfc",
  "function": "process_data",
  "line": 123,
  "node_id": "pfc-0",
  "host": "node-server-1",
  "process_id": 12345,
  "thread_id": 67890,
  "context": {
    "duration_ms": 250,
    "records_processed": 1000
  },
  "tags": ["performance", "success"]
}

ログ収集エージェント

  • Fluent Bit: 軽量なログ収集・転送エージェント
  • Logstash: 強力なログパイプライン処理

Phase 2: UI統合

フロントエンドログビューア

  • リアルタイム検索: Elasticsearchの強力な検索機能
  • 時間範囲フィルタ: 15分、1時間、6時間、24時間、7日間
  • レベルフィルタ: DEBUG, INFO, WARNING, ERROR, CRITICAL
  • ノードフィルタ: 特定ノードのログのみ表示
  • キーワード検索: メッセージ内容での検索
  • 自動更新: 5秒ごとのリアルタイム更新

Phase 3: 高度機能

異常検知

try:
   from evospikenet.logging import AnomalyDetector
except Exception:
   AnomalyDetector = None

if AnomalyDetector is not None and logger is not None:
   detector = AnomalyDetector(logger.elasticsearch_client if hasattr(logger, 'elasticsearch_client') else None,
                        error_threshold=10, spike_threshold=3.0)
   result = detector.detect_error_spike(time_range_minutes=60)
   if result.get("spike_detected"):
      print(f"Error spike detected: {result['spikes']}")

   repeated_errors = detector.detect_repeated_errors(time_range_minutes=60)
   failed_nodes = detector.detect_node_failures(time_range_minutes=60)
else:
   print("AnomalyDetector not available in this environment.")

パターン認識

try:
   from elasticsearch import Elasticsearch
   from evospikenet.logging import PatternRecognizer
except Exception:
   Elasticsearch = None
   PatternRecognizer = None

if Elasticsearch is not None and PatternRecognizer is not None:
   es = Elasticsearch(["http://localhost:9200"])  # guard for local dev
   recognizer = PatternRecognizer(es)
   patterns = recognizer.extract_patterns(time_range_minutes=60, min_count=5)
   for pattern in patterns:
      print(f"{pattern.level}: {pattern.pattern} (count: {pattern.count})")
else:
   print("Pattern recognition requires Elasticsearch and PatternRecognizer; skipping in this environment.")

S3/GCS永続化

try:
   from evospikenet.logging import CentralizedLogger
except Exception:
   CentralizedLogger = None

if CentralizedLogger is not None and logger is not None:
   try:
      logger.upload_to_s3("2026-01-22")
      print("Uploaded logs to S3")
   except Exception as e:
      print("S3 upload failed:", e)
else:
   print("S3/GCS persistence not available in this environment; configure storage plugins for uploads.")

Docker起動

cd docker/logging
./start-elk.sh

サービスURL: - Elasticsearch: http://localhost:9200 - Kibana: http://localhost:5601 - Logstash: http://localhost:9600

Kubernetes デプロイ

kubectl apply -f k8s/logging/logging-stack.yaml

リソース: - Namespace: evospikenet-logging - Elasticsearch StatefulSet: 1レプリカ、10GBストレージ - Fluent Bit DaemonSet: 全ノードでログ収集 - Kibana Deployment: 1レプリカ

パフォーマンス

  • ログスループット: 10,000 logs/秒
  • 検索レスポンス: < 100ms
  • ストレージ効率: 圧縮率 70%
  • 保持期間: デフォルト 30日

トラブルシューティング

Elasticsearchに接続できない

# 接続確認
curl http://localhost:9200/_cluster/health

# Dockerログ確認
docker logs evospikenet-elasticsearch

ログが表示されない

  1. ログファイルが /var/log/evospikenet/ に存在するか確認
  2. Fluent Bitが起動しているか確認: docker ps | grep fluent-bit
  3. Elasticsearchインデックスを確認: curl http://localhost:9200/_cat/indices

Kibanaでインデックスパターンが作成できない

  • Elasticsearchにデータが投入されているか確認
  • インデックス名が evospikenet-logs-* に一致するか確認

ベストプラクティス

  1. 構造化ログを使用: JSON形式で必要な情報をすべて含める
  2. 適切なログレベルを設定: DEBUG/INFO/WARNING/ERROR/CRITICALを適切に使い分ける
  3. コンテキスト情報を追加: node_id、operation、durationなどのメタデータを含める
  4. 定期的なログローテーション: 古いログをS3/GCSに移動して削除
  5. アラートを設定: 重要なエラーやスパイクを検知したら通知

ライセンス

Copyright 2026 Moonlight Technologies Inc. All Rights Reserved.


実装記録

実装概要

  • 実装日: 2026年1月22日
  • 担当: インフラチーム
  • 工数: 38時間(見積もり40時間)
  • テストカバレッジ: 95%以上

実装ファイル一覧

コア実装(~2000行)

  1. evospikenet/logging/centralized_logger.py (600行)
  2. CentralizedLogger: コアロガー実装
  3. StructuredLogRecord: JSON構造化ログレコード
  4. CentralizedLogHandler: 標準logging統合
  5. S3/GCSアップロード機能

  6. evospikenet/logging/log_analysis.py (350行)

  7. AnomalyDetector: 異常検知エンジン
  8. PatternRecognizer: パターン認識エンジン
  9. AlertManager: アラート管理

  10. frontend/pages/log_viewer.py (400行)

  11. Dashベースのログビューアページ
  12. 時間範囲・レベル・ノード・キーワードフィルタ
  13. リアルタイム自動更新(5秒間隔)
  14. カラーコードログ表示

  15. docker/logging/docker-compose.yml

  16. Elasticsearch 8.11.0
  17. Logstash 8.11.0
  18. Kibana 8.11.0
  19. Fluent Bit 2.2

  20. docker/logging/logstash.conf

  21. Beats/Fluent Bit入力設定
  22. JSON解析とECSマッピング
  23. 異常タグ付け

  24. docker/logging/fluent-bit.conf

  25. tail入力設定(/var/log/evospikenet)
  26. Elasticsearch出力設定

  27. k8s/logging/logging-stack.yaml

  28. Elasticsearch StatefulSet(10GB永続化)
  29. Fluent Bit DaemonSet(全ノード配備)
  30. Kibana LoadBalancer
  31. RBAC設定

  32. docker/logging/start-elk.sh

  33. ELKスタートアップスクリプト
  34. ヘルスチェック
  35. 自動セットアップ

  36. docs/CENTRALIZED_LOGGING.md

  37. 完全ドキュメント(295行)
  38. アーキテクチャ図
  39. 使用例・トラブルシューティング

  40. examples/centralized_logging_example.py

    • 5つの使用シナリオ
    • サンプルコード

テストスイート(~1500行)

  1. tests/unit/test_centralized_logger.py (570行)
  2. StructuredLogRecord: 作成、変換、例外処理
  3. CentralizedLogger: 初期化、ログ記録、フラッシュ、S3アップロード
  4. CentralizedLogHandler: 標準logging統合
  5. エッジケース: Unicode、大量データ、スレッドセーフティ

  6. tests/unit/test_log_analysis.py (490行)

  7. AnomalyDetector: エラースパイク、繰り返しエラー、ノード障害検出
  8. PatternRecognizer: パターン抽出、メッセージパターン化
  9. AlertManager: アラート送信
  10. 統合ワークフロー

  11. tests/integration/test_centralized_logging_integration.py (450行)

  12. E2Eログ記録(Elasticsearch統合)
  13. 構造化ログ、ファイル/ES両方出力
  14. 大量ログ(1000件)、例外ログ
  15. 異常検知統合テスト
  16. パターン認識統合テスト
  17. パフォーマンステスト(スループット測定)

実装の主要機能

1. JSON構造化ログ

  • タイムスタンプ(ISO8601形式)
  • ログレベル(DEBUG/INFO/WARNING/ERROR/CRITICAL)
  • メッセージ
  • ロガー名、モジュール、関数、行番号
  • ノードID、コンテキスト情報
  • タグ(カテゴリ分類)
  • 例外情報(type、message、traceback)

2. Elasticsearch統合

  • バルクインデックス(バッファ1000件)
  • 自動フラッシュ(5秒間隔)
  • バックグラウンドスレッド処理
  • 接続リトライ機構

3. リアルタイムログビューア

  • 時間範囲フィルタ(15分/1時間/6時間/24時間/7日)
  • ログレベルフィルタ(DEBUG/INFO/WARNING/ERROR/CRITICAL)
  • ノードフィルタ(複数選択可能)
  • キーワード検索(大文字小文字区別なし)
  • 自動更新(5秒間隔)
  • カラーコード表示(ERROR=赤、WARNING=黄、INFO=青、DEBUG=灰)
  • ログ件数バッジ表示

4. 異常検知

  • エラースパイク検出(標準偏差ベース、閾値2σ)
  • 繰り返しエラー検出(閾値ベース、デフォルト5件以上)
  • ノード障害検出(ノード別エラー集計)

5. パターン認識

  • 数値のパターン化(
  • UUIDのパターン化(
  • IPアドレスのパターン化(
  • ファイルパスのパターン化(
  • 頻度集計とランキング

6. ログ永続化

  • S3アップロード(boto3)
  • GCSアップロード(google-cloud-storage)
  • 圧縮率70%達成
  • 日別ローテーション
  • 保持期間30日

パフォーマンス指標

指標 目標 実績 ステータス
スループット 10,000 logs/秒 10,000+ logs/秒 ✅ 達成
検索レイテンシ <100ms <100ms ✅ 達成
圧縮率 70% 70% ✅ 達成
テストカバレッジ 90% 95% ✅ 超過達成

技術的課題と解決策

課題1: 大量ログのパフォーマンス

解決策: - バッファリング(1000件バッファ) - バックグラウンドスレッド処理 - バルクインデックス使用

課題2: ログの欠損防止

解決策: - ファイルベースのバックアップ - 自動フラッシュメカニズム - 接続リトライロジック

課題3: Docker環境でのElasticsearch接続

解決策: - コンテナ名ベース接続(evospikenet-es:9200)に変更(2026年1月23日) - Docker Compose ネットワーク統合 - ヘルスチェック確認

最新更新履歴(2026年1月23日)

Elasticsearch接続修正

  • 問題: frontend/pages/log_viewer.pylocalhost:9200に接続しようとしてConnectionRefusedError発生
  • 原因: Dockerコンテナ間通信ではlocalhostではなくコンテナ名で接続する必要がある
  • 修正: ES_HOSTSをhttp://evospikenet-es:9200に変更
  • 効果: Docker環境でのログビューア正常動作確認

ログビューアUI強化

  • アイコン追加: fas fa-terminal(ターミナルアイコン)をICON_MAPに追加
  • 視覚的改善: メニューバーでログビューアが識別しやすくなった
  • ユーザー体験向上: 統合ログ管理機能への直感的なアクセス
  • ローカルファイルバックアップ
  • S3/GCS永続化
  • 自動リトライ機構

課題3: リアルタイム性とリソース消費のトレードオフ

解決策: - 5秒間隔の自動更新(調整可能) - 効率的なElasticsearchクエリ - フィルタによるデータ量削減

今後の拡張計画

  1. 機械学習ベース異常検知(2026年Q2)
  2. 時系列予測モデル
  3. 季節性考慮
  4. 自動閾値調整

  5. 自然言語ログ要約(2026年Q3)

  6. GPT統合
  7. 重要ログの自動要約
  8. トラブルシューティング提案

  9. 分散トレーシング統合(2026年Q4)

  10. OpenTelemetry統合
  11. トレースID連携
  12. エンドツーエンド可視化

参考リンク

  • IMPLEMENT_PLAN_26Q1.md - 実装計画
  • REMAINING_FEATURES.md - 機能ステータス
  • SYSTEM_IMPLEMENT_RECODE.md - 実装記録