コンテンツにスキップ

Codex CLIログの場所と診断手順:doctor→TUI・SQLiteの順で確認

対象: Codexの障害をログとdoctorで切り分けたい人

codex doctor --summary
codex doctor --json > codex-doctor.json

先にdoctorで、実行中のCodex、設定、認証の有無、ネットワーク、ログ・状態DBの実パスを確認する。~/.codex/log/codex-tui.logが必ず存在するとは限らないため、固定パスを前提にしない。

この記事のポイント

  • ログを探す前にcodex doctorで障害の層を決める
  • TUIログ、SQLiteログ、セッションJSONLを別物として扱う
  • 公開Issueにはrawログではなく伏字済み要約を載せる

どこを見ればよいか

Codexの診断情報は、役割が違う4種類に分かれる。

情報まず使う方法分かること公開時の注意
健全性レポートcodex doctor --summary設定、認証、ネットワーク、stateの大分類JSON全文にはローカルパスが含まれ得る
TUIテキストログdoctorが示すlog dir直前の警告・エラープロンプトやコマンドが含まれ得る
SQLiteログDBdoctorが示すlog DB内部の構造化ログraw DBを公開しない
セッションJSONL$CODEX_HOME/sessions/会話、ツール呼び出し、結果会話・コード・パスを含むため原則非公開

auth.jsonは診断ログではない。トークンを含む認証資材なので、内容を表示・コピー・添付しない。

手順1:doctorで障害の層を決める

画面で読む

codex doctor --summary

最初は個々のログ行より、次の分類を見る。

  • installation / runtime: PATH重複、実行中バイナリ、更新経路
  • config: 読み込んだCODEX_HOMEconfig.toml
  • auth: 認証が構成されているか。トークン自体は見ない
  • network / websocket: HTTP到達性とWebSocket handshake
  • sandbox: 承認・ファイル・ネットワーク境界
  • state: state DB、log DB、rollout fileの整合性
  • MCP: 設定ファイル上の静的な不整合

たとえばWebSocketだけ失敗してHTTP到達性が成功するなら、認証ファイル削除よりVPN、IPv6、プロキシ、WebSocket経路を先に疑う。

JSONは保存後に必要部分だけ抜く

codex doctor --json > codex-doctor.json

--jsonに対応していない古いCLIではエラーになる。その場合は先にcodex --versionを記録し、CLIの更新可否を確認する。

JSONは機械可読だが、完全匿名とは限らない。公式Issueでも、raw JSONではなくローカルユーザー名、パス、プロジェクト名、state locationを伏せた要約を共有する例がある。1

手順2:実際のログ場所をdoctorから読む

Codexのログ保存方式は、インストール経路や機能構成で変わる。環境によっては次の両方、または片方だけがある。

$CODEX_HOME/log/codex-tui.log
<sqlite home>/logs_2.sqlite

codex doctor --jsonconfig.loadstate.pathsに、log dirlog DBsqlite homeが出る。log dirがmissingでも、logs_2.sqliteが正常なら「ログが一切ない」とは限らない。

テキストログが存在する場合だけ、末尾と対象文字列を読む。

tail -n 120 "$CODEX_HOME/log/codex-tui.log"
rg -n -i 'error|warn|reconnect|401|403|timeout|mcp' \
  "$CODEX_HOME/log/codex-tui.log" | tail -n 80

CODEX_HOMEを設定していない環境では、doctorが示した実パスに置き換える。

SQLiteログDBは内部スキーマが変わり得る。独自SQLを固定手順として記事や運用へ埋め込まず、まずdoctorのDB integrity結果と、エラー画面の文字列を使う。raw DBをGitHub Issueへ添付しない。

手順3:エラー文字列で分岐する

doctor / 画面の手掛かり次に確認するもの
HTTP 401 / auth failedcodex login状態、アカウント、時刻ずれ。auth.json本文は見ない
WebSocket handshake failedVPN、proxy、IPv4/IPv6、再接続記事
Network access is restrictedworkspace sandboxのnetwork設定
missing field sandboxPolicyBrowser / Computer Useとnode_replの版互換性
MCP command/env/cwd warning対象MCPの実行ファイル、環境変数、cwd
failed to initialize sqlite state runtimeDBエラーコード、パスがWindows/WSLをまたいでいないか
PATHに複数Codex実行中バイナリと更新先の不一致

ログ例を想像でエラーへ当てはめない。画面に出た正確な1行とdoctorの分類が一致するかを先に確認する。

公開Issueに載せる最小セット

次のテンプレートで十分なことが多い。

## Environment
- Codex version: `<codex --version>`
- Surface: CLI / Desktop / IDE extension
- OS: `<OS and version>`
- Install method: npm / Homebrew / standalone / Store

## Exact error
`<one exact error message>`

## Reproduction
1. ...
2. ...
3. ...

## Doctor summary (redacted)
- installation: ...
- config: ...
- auth: configured / not configured
- network HTTP: ...
- WebSocket: ...
- state DB: ...

## Already tried
- ...

添付しないもの

  • auth.json、APIキー、Cookie、認証ヘッダー
  • logs_2.sqliteそのもの
  • セッションJSONLそのもの
  • .codex / CODEX_HOME全体のzip
  • .env、SSH鍵、クラウド資格情報
  • 未確認のTUIログ全文

公式Codex Issueでも、SQLiteログとセッションファイルにはプロンプト、ローカルパス、コマンド履歴、プロジェクト名、ツール出力が入り得ると注意されている。2

よくある誤診

doctorが成功したのでDesktopも正常

ターミナルのCLIとDesktop同梱app-serverが別バイナリなら、CLIだけ正常なことがある。Desktop固有障害ではAboutのビルド番号も記録する。

codex-tui.logがないのでログがない

構造化ログがlogs_2.sqliteへ保存されている場合がある。doctorのstate.pathsを確認する。

401なのでauth.jsonを削除する

認証ファイルの削除は状態を失う変更だ。まずcodex loginの状態、doctorのauth分類、システム時刻、正確なHTTPエラーを確認する。

/feedbackの出力は常に同じ

スラッシュコマンドや出力形式は変わる。存在しない固定フィールドや架空のRequest ID例を診断手順の前提にしない。

まとめ

  • 最初はcodex doctor --summary、共有用には--jsonの必要部分だけを伏字して使う
  • ログの実パスは固定せず、doctorのlog dirlog DBを読む
  • TUIログ、SQLite DB、セッションJSONL、認証ファイルを同じものとして扱わない
  • rawログやDBを公開せず、正確なエラー1行とdoctor要約をIssueへ載せる

参考資料

関連記事