Skip to content

Log Parser Architecture

ゲームログを解析して試合情報(BAN/PICK / 勝敗 / 統計)を抽出するエンジンの構成。code-split-and-coverage spec で 3 層 + finalize + statistics に分割した。

ファイル構成

src/utils/logAnalyzer/
├── LogParser.ts              # 一括解析モード(バッチ用 facade)
├── StreamLogParser.ts        # 旧ストリーム実装(互換のため残置)
├── CharacterService.ts       # キャラ ID ↔ 名前変換
├── StatisticsCalculator.ts   # 統計集計の facade
├── statistics/
│   └── aggregate.ts          # 純関数の試合統計集計(spec で抽出)
├── core/
│   ├── LogParserCore.ts      # 一括解析オーケストレータ
│   ├── StreamLogParserV2.ts  # ストリーム解析(リアルタイム用、StreamFsm 内蔵)
│   ├── line/
│   │   └── LineParser.ts     # 純粋な行パーサ(regex / 抽出関数 / MARKER)
│   ├── fsm/
│   │   └── StreamFsm.ts      # phase の状態機械
│   ├── aggregator/
│   │   └── Aggregator.ts     # picks / bans / players の集約
│   ├── finalize/
│   │   └── finalizeMatchData.ts  # 集計結果の最終整形
│   └── bp/                   # BP 関連の追加ロジック置き場(拡張用)
├── battleType/               # BattleType の数値 ↔ 文字列マッピング
├── matchFilters.ts
├── timeUtils.ts
└── types.ts

scripts/analyze-log/ は CLI 解析スクリプト群(同じエンジンを使う薄いラッパ)。

レイヤー構成

ファイル責務依存
linecore/line/LineParser.ts1 行を ParsedLine に変換する純粋関数群(regex / 抽出関数 / MARKER)なし
fsmcore/fsm/StreamFsm.tsphase の状態保持・遷移・onChange リスナーline(型のみ)
aggregatorcore/aggregator/Aggregator.ts重複排除 / ソート / Normal 戦キャラ抽出line(型のみ)/ CharacterServiceLike (DI)
finalizecore/finalize/finalizeMatchData.tsrank / type 推定 / 整形aggregator
statisticsstatistics/aggregate.ts試合配列から KPI を集計(純関数)finalize 後の MatchData 配列

状態機械(StreamFsm)

リアルタイム解析時の phase 遷移。StreamLogParserV2.ts が内蔵する。

各状態の役割:

状態入力で受け付ける主なマーカー出力 / 次状態
IDLE試合開始系マーカーBP
BPBP数据日志 (Rank), プレイヤー BAN/PICKaggregator に push
LOADING匹配成功开始加载战斗INGAME へ(タイムアウトすれば IDLE
INGAMEON GAME START, ON BATTLE END PUSHRESULT
RESULTupload sdk battle playerMatchData を確定し IDLE

実遷移表は core/fsm/StreamFsm.tstransition() メソッドに 明示的に列挙 されている。

ログマーカー

BP フェーズ関連

マーカー説明出現条件
BP数据日志BAN/PICK 詳細(プレイヤー名 / キャラ ID 等)Rank のみ
匹配成功开始加载战斗マッチング成功 → BP フェーズ終了両方
PageBattleBanPick2V2.prefabBP 画面 UI ログRank のみ

試合進行関連

マーカー説明
ON GAME STARTゲーム開始
ON BATTLE END PUSHバトル終了
upload sdk battle player試合結果(プレイヤー名・勝敗)

マッチタイプマーカー

マーカー説明
TYPE:Rank_2v2ランク 2v2
TYPE:Rank_1v1ランク 1v1
TYPE:Normal_2v2ノーマル 2v2
TYPE:Normal_1v1ノーマル 1v1
TYPE:Customカスタム

Rank 判定ロジック(finalize/finalizeMatchData.ts)

集計後 (Aggregator 出力時点) は rank/normal 判定が確定していないことがある。finalizeMatchData で以下の 優先順位 で確定する。

優先度判定基準信頼度
1TYPE: マーカー(試合結果の前 500 行以内)確定
2BP区間内に BP数据日志 があるRank と推定
3プレイヤー数(2 = 1v1, 4 = 2v2)+ 既定 Normalフォールバック

一括解析 vs ストリーム解析

種別エントリ用途
一括LogParserLogParserCore既存ログファイルの解析(DB インポート時)
ストリームStreamLogParserV2リアルタイムログ監視 (LogWatcherService)

両方とも内部では同じ line / aggregator / finalize を使う。違いは fsm の有無のみ:

Statistics 集計(純関数)

statistics/aggregate.tsMatchData[] を入力に取る純関数群StatisticsCalculator の facade から呼ばれる。

主な集計関数(抜粋):

  • aggregatePlayerStats(matches)
  • aggregateCharacterPickStats(matches)
  • aggregateCharacterBanStats(matches)
  • aggregateMatchupStats(matches, focusUid)

純関数なので vitest で簡単にテストでき、statistics/aggregate.test.ts で 15 ケース。

CharacterService

キャラの ID / DB 名 / 画像名 の対応を管理する。reseponses/characters_by_rolecode.json を読み込み、nameAliases で DB 名と画像ファイル名のずれを吸収する。

新規キャラ追加時の手順は Add New Character を参照。

テスト

テストファイル主なケース
linecore/__tests__/LineParser.test.tsregex の table-driven
fsmcore/__tests__/StreamFsm.test.ts全遷移を網羅
aggregatorcore/__tests__/Aggregator.test.tsfixture ベース
finalizecore/finalize/finalizeMatchData.test.tsrank/type 推定 10 ケース
statisticsstatistics/aggregate.test.tsKPI 集計 15 ケース
一括core/__tests__/LogParserCore.test.ts大規模 fixture
ストリームcore/StreamLogParserV2.test.ts + regression.test.ts統合シナリオ

CLI ツール

bash
yarn analyze-log                  # デフォルト UID で解析
npx tsx scripts/analyze-log/index.ts "path/to/log.txt"

# 特定マーカー確認
grep -n "BP数据日志" scripts/testData/.../Log_*.txt | head -10
grep -n "TYPE:" scripts/testData/.../Log_*.txt | head -30

解析結果の出力内容

試合基本情報

  • 試合 ID / タイムスタンプ
  • マッチタイプ(Rank_2v2 / Normal_1v1 等)
  • ゲーム開始・終了時刻 / duration

プレイヤー情報

  • 名前 / UID
  • 勝敗 / チーム(A or B)
  • 使用キャラ / 所持キャラ枠

BAN/PICK 情報(Rank のみ)

  • BAN されたキャラ + BAN したプレイヤー
  • PICK されたキャラ + PICK したプレイヤー

統計情報(statistics/aggregate)

  • プレイヤー別 勝敗数・勝率
  • キャラ別 BAN/PICK 回数 / 勝率
  • 対戦相手分析

関連ドキュメント


Last verified: 2026-05-06 / against commit e351b23a