ログと履歴管理の確認ガイド
概要
NexusCore のジョブ履歴とログ管理機能の動作確認とトラブルシューティングガイドです。
1. ジョブ履歴の保存
1.1 保存先
ジョブの履歴は以下の場所に保存されます:
- 履歴ファイル:
<project_root>/.nexus/history/{kind}.log.jsonlkind: ジョブの種類(例: “orchestrator”, “self_healing”)- 形式: JSONL(1行 = 1実行の RunRecord)
- セッション状態:
<project_root>/.nexus/sessions/{session_id}.state.json- セッションの現在状態(フェーズ、メタデータなど)
1.2 記録される情報
RunRecord に含まれる情報:
run_id: ジョブの実行IDsession_id: セッションIDkind: ジョブの種類status: 状態(”success”, “error”, “fixed”, “not_fixed” など)started_at: 開始時刻(Unix timestamp)finished_at: 終了時刻(Unix timestamp)summary: サマリーdetails: 詳細情報(辞書形式)
SessionState に含まれる情報:
session_id: セッションIDstatus: セッション状態(”running”, “paused”, “stopped”)last_phase: 最後のフェーズ(例: “after_planning”, “state_completed”)last_updated: 最終更新時刻(Unix timestamp)metadata: メタデータ(辞書形式)
1.3 状態遷移の記録
ジョブの状態遷移は以下のように記録されます:
- Pending → Running: ジョブ開始時
- Running → Completed: ジョブ成功時
- Running → Failed: ジョブ失敗時
各状態遷移時に:
RunHistoryLoggerが履歴を記録SessionControllerがセッション状態を保存
2. RunHistoryLogger と SessionController の連携
2.1 統合の仕組み
JobStateMachine が RunHistoryLogger と SessionController を統合:
# celery_app.py での使用例
session_controller = SessionController(
session_id=job_id,
root_dir=session_dir,
)
history_logger = RunHistoryLogger(project_root=project.local_path)
state_machine = JobStateMachine(
job_id=job_id,
session_controller=session_controller,
history_logger=history_logger,
job_type="orchestrator",
)
2.2 動作フロー
- ジョブ開始時:
state_machine.start()→ Pending → RunningSessionController.checkpoint()でセッション状態を保存RunHistoryLoggerで状態遷移を記録
- フェーズごと:
SessionController.checkpoint(phase="after_planning", metadata={...})でチェックポイントを保存
- ジョブ完了時:
state_machine.complete()→ Running → CompletedRunHistoryLogger.log_run()で最終履歴を記録SessionController.checkpoint()で最終状態を保存
- ジョブ失敗時:
state_machine.fail()→ Running → FailedRunHistoryLogger.log_run()でエラー履歴を記録SessionController.checkpoint()でエラー状態を保存
3. 確認項目
3.1 ジョブの開始時に履歴が保存されているか
# 履歴ファイルを確認
cat <project_root>/.nexus/history/orchestrator.log.jsonl | jq .
# 最新の履歴を確認
tail -1 <project_root>/.nexus/history/orchestrator.log.jsonl | jq .
確認ポイント:
run_idが正しく記録されているかstarted_atが記録されているかstatusが “success” または “error” になっているか
3.2 状態遷移時に履歴が保存されているか
# セッション状態を確認
cat <project_root>/.nexus/sessions/<session_id>.state.json | jq .
# 履歴ファイルを確認
cat <project_root>/.nexus/history/orchestrator.log.jsonl | jq .
確認ポイント:
last_phaseが正しく更新されているかmetadataに必要な情報が含まれているか- 履歴ファイルに状態遷移が記録されているか
3.3 エラーハンドリング時に履歴が適切に記録されているか
# エラー履歴を確認
cat <project_root>/.nexus/history/orchestrator.log.jsonl | jq 'select(.status == "error")'
# エラーメッセージを確認
cat <project_root>/.nexus/history/orchestrator.log.jsonl | jq 'select(.status == "error") | .summary'
確認ポイント:
statusが “error” になっているかsummaryにエラーメッセージが含まれているかdetails.errorにエラー詳細が記録されているか
3.4 セッション情報が適切に保存され、再開時に復元されること
# セッション状態を確認
cat <project_root>/.nexus/sessions/<session_id>.state.json | jq .
# セッションの再開をシミュレート
python -c "
from nexuscore.core.session_control import SessionController
controller = SessionController(session_id='<session_id>', root_dir='<project_root>/.nexus/sessions')
# 状態ファイルが存在することを確認
"
確認ポイント:
- セッション状態ファイルが存在するか
last_phaseが正しく保存されているかmetadataが正しく保存されているか- 再開時に状態が復元できるか
4. トラブルシューティング
4.1 履歴が保存されない場合
原因:
- ディレクトリの権限不足
- ディスク容量不足
RunHistoryLoggerの初期化エラー
対処:
# ディレクトリの権限を確認
ls -la <project_root>/.nexus/history/
# ディスク容量を確認
df -h
# ログを確認
tail -f <project_root>/.nexus/history/orchestrator.log.jsonl
4.2 セッション状態が保存されない場合
原因:
- ディレクトリの権限不足
SessionControllerの初期化エラー- チェックポイントが呼ばれていない
対処:
# ディレクトリの権限を確認
ls -la <project_root>/.nexus/sessions/
# セッション状態ファイルを確認
ls -la <project_root>/.nexus/sessions/*.state.json
# コードでチェックポイントが呼ばれているか確認
grep -r "checkpoint" src/nexuscore/
4.3 履歴ファイルが破損している場合
対処:
# RunHistoryLogger の load_runs メソッドは破損した行をスキップする
from nexuscore.core.run_history import RunHistoryLogger
history_logger = RunHistoryLogger(project_root="<project_root>")
records = history_logger.load_runs("orchestrator")
# 破損した行は自動的にスキップされる
5. テスト
統合テストを実行して、ログと履歴管理が正しく動作することを確認:
# 統合テストを実行
PYTHONPATH=src python -m pytest tests/integration/test_log_history_management.py -v
# 特定のテストを実行
PYTHONPATH=src python -m pytest tests/integration/test_log_history_management.py::TestLogHistoryManagement::test_job_history_saved_to_jsonl -v
6. データベースへの保存(将来の拡張)
現在は JSONL ファイルに保存していますが、将来的にデータベースに保存する場合:
CREATE TABLE job_history (
id SERIAL PRIMARY KEY,
job_id VARCHAR(255) NOT NULL,
session_id VARCHAR(255) NOT NULL,
tenant_id INT,
user_id INT,
job_type VARCHAR(255),
job_state VARCHAR(255),
status VARCHAR(255),
started_at TIMESTAMP,
finished_at TIMESTAMP,
summary TEXT,
details JSONB,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_job_history_job_id ON job_history(job_id);
CREATE INDEX idx_job_history_session_id ON job_history(session_id);
CREATE INDEX idx_job_history_tenant_id ON job_history(tenant_id);
CREATE INDEX idx_job_history_created_at ON job_history(created_at);
7. 関連ファイル
src/nexuscore/core/run_history.py: RunHistoryLogger の実装src/nexuscore/core/session_control.py: SessionController の実装src/nexuscore/core/job_state_machine.py: JobStateMachine の実装src/nexuscore/webapp/celery_app.py: Celery タスクでの使用例tests/integration/test_log_history_management.py: 統合テスト