ログビュワー
記録済みの通信ログファイル(CSV / JSONL)を読み込み、複数ポートのログを時刻順に統合して分析するウィンドウです。さらに、採取ログ DB(.commsimlog)を開くと、TCP のコネクション(接続〜切断の1周期)単位でログを切り分けて分析できます。
ログのファイル出力については ログのファイル出力 を参照してください。
汎用ツールと何が違う?
Excel・テキストエディタなどの汎用ツールでログを開いた場合、次の問題があります。
- バイナリデータが HEX 文字列のままで、フィールドの意味が読み取れない
- 複数のセッション(ポート)のログファイルが別々で、時系列の因果関係が追えない
ログビュワーはこの2点を解決します。
- フィールド再デコード: 現在のプロジェクトの構造定義(または別途読み込んだ定義)を使って、選択したパケットのフィールドを自動分解して表示します
- 複数ポートの時刻マージ: 複数の CSV/JSONL ファイルを同時に読み込み、タイムスタンプ昇順で1本のタイムラインに統合します。どのポートのログか「ソース」列で識別できます
開き方
ログビュワーは次の2つの方法で開けます。
| 開き方 | 動作 |
|---|---|
| メニューバー「ツール」→「ログビュワーを開く…」 | 空の状態でビュワーが開きます。ツールバーの「ログを開く…」ボタンで採取ログ DB(.commsimlog)を選択します。CSV/JSONL を取り込むときは右の ▾ →「ファイルから取り込む」を選びます |
| セッションのログ常設ペインの「ビュワーで開く」 | そのセッションの直近のログを事前読み込みした状態でビュワーが開きます。採取ログ DB(.commsimlog)が記録されていればそれを優先し、コネクション一覧つきで開きます(無ければ CSV/JSONL を開きます) |
| ビュワーの「ログを開く…」ボタン | ツールバーの「ログを開く…」から .commsimlog ファイルを選択して開きます(詳細は次節) |
ログビュワーはモードレスウィンドウです。開いている間もメインウィンドウで通信を続けられます。同じウィンドウを二重に開こうとした場合は、既存のウィンドウが前面に表示されます。
採取ログ DB(コネクション単位の分析)
長時間プロキシで採取したログをあとからコネクション単位で読み解くための機能です。再現性の低い不具合を「どの接続で何が起きたか」に分解して調査できます。採取ログ DB(.commsimlog)は、ログ記録を有効にしたセッションが通信内容を蓄積した SQLite ファイルで、大量ログでも軽快に絞り込めるように設計されています。
#1, #2 …)ごとにログを切り分けて分析できます。開き方
- ツールバーの「ログを開く…」ボタンで
.commsimlogを選択します。複数のファイルをまとめて選択すると、複数日の採取ログを時刻順にマージして1画面で追跡できます(後述) - または、セッションのログ常設ペインの「ビュワーで開く」で、そのセッションの採取ログ DB を直接開きます
コネクション一覧ペイン
採取ログ DB を開くと、画面左にコネクション一覧が現れます。TCP の接続〜切断を1周期=1コネクションとして採番(#1, #2 …)し、各行に次の情報を表示します。
| 項目 | 内容 |
|---|---|
| コネクション番号 | 接続のたびに採番される連番(#1, #2 …)。一覧でも各行の「ソース」列に #N として表示され、どの接続のやり取りかを識別できます |
| 接続元 → 接続先 | クライアントの接続元 IP:ポートと、プロキシ時は上流(実機)側の IP:ポート。「どのクライアントが、どの機器とつながった接続か」という3層(クライアント/コネクション/接続機器)を区別できます |
| 件数・期間 | その接続の送受信件数・総バイト数・開始〜終了の時刻 |
選択して絞り込む
- 一覧からコネクションを選ぶと、その接続の周期のログ行だけを読み込んで表示します(接続単位の絞り込み)
- 先頭の「すべて」を選ぶと全コネクションをまとめて表示します(大量ログでは上限件数まで読み込み、超過時はその旨を下部に表示します)
- 必要な接続だけをインデックス参照で読み込むため、ファイルが大きくても一覧の切り替えは軽快です
セッションで絞り込む
1つの日ファイルには、その日に記録したすべてのセッション(CommSim の1ポート=1タブ)のやり取りがまとまって入っています。コネクション一覧ペインのヘッダにセッションセレクタが現れ(2セッション以上含まれるときのみ)、特定の1セッションに絞り込めます。
- セレクタには各セッション名が表示されます(記録時のセッション名がログに保存されているため、ファイル単体でもセッション名が分かります)
- 「すべてのセッション」を選ぶと全セッションを時刻順に横断表示、特定のセッションを選ぶとそのセッションの行だけに一覧が絞られます
- UDP セッションはコネクションレスのため
#Nを持ちませんが、セッションセレクタには「セッション名 (Udp)」として表示されます。UDP セッションを選択すると、そのセッションの全行が表示されます(「すべてのセッション」でも表示されます)
複数日にまたいで追跡する
「ログを開く…」で複数の日ファイルを同時に選択すると、各ファイルのログをタイムスタンプ昇順で1本のタイムラインにマージして表示します。日付をまたぐ長時間の挙動や、夜間に再現する不具合を、日付の切れ目を気にせず追えます。
- 深夜をまたいだ接続(0時前に開始し0時後に切断した接続)は、前日・当日の2ファイルに分かれて記録されますが、ビュワーが同じコネクションとして1つにまとめて表示します(
#Nも一致) - セッションセレクタと併用すれば、複数日 × 特定の1セッションだけを追跡できます
コネクション採番は TCP のみです。UDP はコネクションレスのため接続周期を持たず、
#Nは付きません。
シナリオ書き出しは1ファイルだけを開いているときに利用できます(複数日マージ中は対象が曖昧になるため無効)。
DB 操作(エクスポート / クリア / 最適化)
採取ログ DB を単一ファイルで開いているとき、ツールバーに DB 操作ボタンが現れます(複数日マージ中は無効)。
| ボタン | 操作 | 説明 |
|---|---|---|
| エクスポート ▾ | CSV に書き出す / JSONL に書き出す | 現在の選択スコープ(選択中のコネクションがあればそのコネクション、なければセッションフィルタ全体)の内容を CSV または JSONL ファイルへ書き出します。フォーマットの詳細は 採取ログの記録と保存 を参照してください |
| クリア ▾ | すべて削除… | DB 内の全エントリを削除します(確認ダイアログあり) |
| このコネクションを削除… | 選択中のコネクション(#N)のエントリを削除します(確認ダイアログあり)。コネクション選択中のみ有効 |
|
| 期間フィルタより前を削除… | 期間フィルタの開始日時より前のエントリを削除します(確認ダイアログあり)。期間フィルタ設定中のみ有効 | |
| 最適化 | (クリックのみ) | SQLite の VACUUM を実行して DB ファイルを縮小します。大量削除後にファイルサイズが減らないと感じたら実行してください |
ツールバーには現在の DB ファイルサイズ(例: 2.5 MB)が常時表示されます。最適化実行後はサイズが更新されます。
これらの操作は元に戻せません。削除前に「エクスポート」で必要なデータを書き出しておくことをおすすめします。
採取ログのインポート(外部ファイルの取り込み)は、ツールバー「ログを開く」の ▾「ファイルから取り込む」(CSV / JSONL)が担います。
シナリオとして保存(再現データ化)
採取ログ DB で選んだコネクションを、リプレイ用シナリオ(.commscenario)として書き出せます。「長時間プロキシ採取 → ログ解析 → 不具合が起きた接続を再現データ化 → スタブモードで決定論リプレイ」という調査の流れが、1 つのアプリ内で完結します。リプレイ再生については シナリオ録画・リプレイ/障害注入 を参照してください。
手順
- 左のコネクション一覧から書き出したいコネクションを 1 つ選ぶ(「すべて」選択時はボタンが現れません)
- コネクション一覧ペイン下部の「シナリオに書き出す…」をクリック
- プレビューで内容を確認して「保存…」→ 保存先(
.commscenario)を指定 - 「保存後、選択中セッションのリプレイタブで開く」(既定 ON)にしておくと、保存後そのままメイン画面の選択中セッションのリプレイタブへ読み込まれます
プレビューの見方(方向の確認)
スタブ再生では CommSim が実機(デバイス)を演じてテスト対象アプリと通信します。プレビューは方向の取り違え(「再生はできるが再現にならない」不具合)を防ぐため、次を表示します。
| 項目 | 意味 |
|---|---|
| 採取モード | そのコネクションが「プロキシ採取」か「スタブ採取」か |
| CommSim 送信(機器→アプリ) | 再生時に CommSim が実機役として送信するステップ数 |
| 受信待ち(アプリ→機器) | 再生時に CommSim が受信を待つステップ数 |
| 総ステップ/総バイト | シナリオに含まれるステップ数とペイロード総量 |
向きのあるデータ行(送受信)だけがステップになります。システム/エラー/スクリプトなど向きのない行は除外されます。ステップ数・総バイトがシナリオの上限を超える場合は、保存前に警告が出て「先頭の一定数のみ書き出す」リカバリを選べます(さらに絞るには時間範囲などで対象を狭めてください)。
画面の見方
ログビュワーの画面は上下2段で構成されます。上段が一覧(またはタイムライン)、下段が選択行の詳細です(電文は横長になりやすいため、詳細は全幅で見せます)。境界はドラッグで高さを変えられます。
| エリア | 内容 |
|---|---|
| 上段(統合一覧 / タイムライン) | 読み込んだ全ログ行をタイムスタンプ昇順で表示する DataGrid(一覧モード)。「タイムスタンプ / ソース / 種別 / 方向 / HEX / 内容」の列があります(「内容」は System/Error や構造体パース要約など Payload を持たない行の解釈テキスト)。ツールバーの切替でタイムライン(時系列波形)にも切り替えられます |
| 下段左(HEX/ASCII ダンプ) | 選択行のバイト列を HEX 形式と ASCII プレビューでダンプ表示します |
| 下段右(フィールド分解) | 構造定義にマッチした場合、フィールド名・値・オフセットをリスト表示します。マッチしない場合は「該当構造なし」と表示されます |
ソース列による識別
複数ファイルを同時に読み込むと、各行の「ソース」列に元のファイル名が表示されます。どのセッション・ポートから記録されたログかを一目で識別できます。
フィルタ・検索
種別フィルタ
ツールバーの「種別」ドロップダウンを開き、チェックリストで表示するログ種別を絞り込めます。先頭の「(すべて選択)」で全種別を一括 ON/OFF でき、絞り込み中はボタンに「種別 (n/7)」と件数が表示されます。
| 項目 | 対象 |
|---|---|
| Tx | 送信ログ |
| Rx | 受信ログ |
| Heartbeat | ハートビート系ログ |
| System | システムメッセージ |
| Error | エラー |
| Proxy | 中継(プロキシ)ログ |
| Script | スクリプト応答ログ |
テキスト / HEX 検索
- 検索ボックスにキーワードを入力すると、メッセージ列でリアルタイムに絞り込みます
- 「HEX」ボタンで切り替えると、バイト列を HEX 文字列で検索します(例:
4F 4B) - ヘッダの件数表示(例:
42 / 180 件)で、全件数に対するフィルタ後の件数を確認できます
期間(時間)フィルタ
フィルタバーの「期間」欄に開始/終了の日時(yyyy-MM-dd HH:mm:ss)を入力すると、その時間帯のログだけに絞り込みます。一方だけの入力(開始のみ/終了のみ)も可能です。
- タイムライン表示で Shift+ドラッグして範囲を選ぶと、選んだ時間帯が「期間」欄に反映されます(逆に欄へ入力するとタイムライン上に選択帯が表示されます)
- 「期間解除」ボタンで絞り込みを解除します
タイムライン表示(一覧/タイムライン切替)
ツールバーの「一覧 / タイムライン」トグルで、読み込んだログを時系列の波形ビューに切り替えられます。一覧(テキスト)では読み取りにくい「どのポートが、いつ、どの順で送受信したか」という機器間の前後関係・同時性を一目で把握するためのビューです。
- レーン=ソース(複数機器を並べて表示): ログの「ソース」(ポート/ファイル)ごとに横帯(レーン)を割り当て、各メッセージを発生時刻の位置に縦線で描画します。複数機器のログをまとめて読み込めば、それぞれが別レーンとして上下に並び、機器間の前後関係が読めます
- 色=種別: 送信/受信/エラー/ハートビート/プロキシなどログ種別ごとに色分けします(一覧の種別色と共通)
- ズーム / パン: マウスホイールでカーソル位置を中心に拡大・縮小、ドラッグで左右にスクロールします。密集した区間は拡大すると個々のイベントが分離して見えます
- 時間軸は上端に固定: レーンが多くて縦スクロールしても、上部の時間軸(目盛)は常に見えるよう固定されます
- レーン名の列幅を調整: 左のレーン名列(ガター)の右端をドラッグすると幅を変えられます。幅は次回以降も保持されます
- ファイル情報(レーン名のホバー/クリック): 左のレーン名にマウスを乗せると、そのファイルのパス・期間(開始〜終了)・総件数(種別別の内訳)をツールチップで表示します。レーン名をクリックすると、下段にそのファイルの情報(名前・フルパス・期間+経過時間・総件数・種別別件数)を表示します。再びイベント(縦線)をクリックすれば下段は HEX/フィールド分解に戻ります
- 選択の双方向同期: タイムライン上のイベントをクリックすると下段に HEX/フィールド分解が表示され、一覧で選択した行はタイムライン側でも強調(必要なら自動スクロール)されます
- 期間の選択: タイムライン上を Shift+ドラッグすると、その時間帯で絞り込みます(フィルタバーの「期間」入力と相互に連動)。Shift+クリックで解除できます
- フィルタ共通: 種別フィルタ・検索・期間の絞り込みはタイムラインにもそのまま反映されます
イベントが非常に多い区間は間引き表示(同じ位置のイベントを集約)され、画面右上にその旨を表示します。拡大すると間引きが解けて詳細が見えます。表示モード・選択・フィルタは一覧と同じデータを共有するため、切り替えても読み込み直しは不要です。
下段 — HEX/ASCII ダンプとフィールド分解
一覧またはタイムラインで行(イベント)を選択すると、下段にそのパケットの詳細(左に HEX/ASCII ダンプ、右にフィールド分解)が表示されます。なお、タイムラインでレーン名(ファイル名)をクリックした場合は、下段が同じ位置にファイル情報(名前・フルパス・期間+経過時間・総件数・種別別件数)を表示します(イベントをクリックすれば HEX/フィールド分解に戻ります)。
HEX/ASCII ダンプ
バイト列を HEX 形式と対応する ASCII 文字で表示します(印字不能文字は .)。
フィールド分解
現在の構造定義で選択行のバイト列を解析し、フィールドごとに値を表示します。
- フレーミング設定(プロジェクト共有)に従って論理メッセージを切り出し、各フィールドの型・長さに沿って値を解釈します
- マッチする構造定義が見つかった場合はフィールド一覧と構造名を表示します
- マッチしない場合(バイナリではないテキストログ行など)は「該当構造なし」と表示されます
フィールド分解は 読み取り専用です。構造定義を変更したい場合はメインウィンドウの「プロジェクト」→「構造体定義…」から行ってください。
構造定義の供給
フィールド分解に使う構造定義は、次の2通りで供給できます。
| 供給元 | 動作 |
|---|---|
| 現在のプロジェクト(既定) | ビュワーを開いた時点のプロジェクトの構造定義を使います。ウィンドウ下部のステータスバーに「現在のプロジェクト」と表示されます |
| ファイルから読み込む | ツールバーの「構造定義を読み込む」ボタンで .commsim-struct(構造体エクスポートファイル)または .commsim(プロジェクトファイル)を選択します。選択したファイルの構造定義に差し替えます |
- 「構造定義を読み込む」で差し替えた場合、現在のプロジェクトには影響しません(ビュワー内のみで参照します)
- 過去のプロジェクトファイルを指定することで、当時の構造定義でログを再解析できます
大容量ファイルの扱い
- ファイルの読み込みは非同期で実行されます。読み込み中はプログレステキストが表示されます
- 読み込みを途中でやめたい場合は「キャンセル」ボタンをクリックします
- 一覧の描画は DataGrid 仮想化によって最適化されており、数万件のログでもスクロールが重くなりません
- ファイル内に解析できない壊れた行がある場合は自動でスキップし、スキップした件数をステータスバーに表示します
ログビュワーは読み取り専用です。元のログファイルへの書き込み・削除は行いません。
Phase 2 で追加予定の機能
現在(Phase 1)は未実装ですが、以下の機能を将来追加する予定です。
- 統計サマリ: 種別ごとの件数・バイト数・平均間隔などの集計
- 抽出エクスポート: フィルタ・検索条件で絞り込んだ行を CSV/JSONL で書き出す