json-log-viewer:218⭐のインタラクティブ JSON ログビューア、ターミナルでの構造化ログ分析ツール
json-log-viewer:218⭐のインタラクティブ JSON ログビューア
マイクロサービスとコンテナ化の時代、JSON 形式の構造化ログは標準となっています。しかし、サーバー上でこれらのログを素早く確認する必要がある場合、生の JSON の可読性はしばしば低くなります。json-log-viewer はわずか 218 stars の小規模なツールで、Go 言語で書かれ、Bubble Tea TUI フレームワークをベースに、コマンドライン環境にインタラクティブな JSON ログ閲覧体験を提供します。
プロジェクト概要
| 属性 | 内容 |
|---|---|
| GitHub | hedhyw/json-log-viewer |
| Stars | 218 |
| 言語 | Go |
| 特徴 | インタラクティブ TUI、リアルタイムフィルタリング、複数形式解析 |
| 最終更新 | 2週間前 |
解決する問題
JSON ログを処理する際、開発者はしばしば以下の悩みに直面します:
catやtailで直接確認すると、JSON のネスト構造が読みにくいjqを使うにはクエリ構文を覚える必要があり、臨時の分析では効率が悪い- 大規模なログファイルは通常のエディタで開くのが遅い
- 時間、レベル、フィールドでログエントリを素早くフィルタリングしたい
json-log-viewer は問題をシンプルにします:ファイルを開き、方向キーで閲覧し、/ で検索し、q で終了します。
主な機能
インタラクティブ TUI インターフェース
Bubble Tea フレームワークで構築されたターミナルユーザーインターフェース:
- 方向キーナビゲーション:↑↓ でログエントリを閲覧、←→ でネスト JSON を展開/折りたたみ
- リアルタイムフィルタリング:キーワード入力で即座にログをフィルタリング、待ち時間なし
- フィールドハイライト:一般的なフィールド(level、timestamp、message)を自動認識して色付け
- レスポンシブデザイン:ターミナルウィンドウサイズに自動適応
インテリジェントなログ解析
複数の一般的な JSON ログ形式をサポート:
// 標準的な構造化ログ
{"level": "error", "timestamp": "2025-01-15T10:30:00Z", "message": "Connection failed"}
// ネストオブジェクトの自動展開
{"level": "info", "data": {"user_id": 123, "action": "login", "ip": "192.168.1.1"}}
// 配列フィールドのサポート
{"tags": ["api", "v2", "critical"], "duration_ms": 45}
非 JSON 行の場合、ツールは自動的にプレーンテキストモードにフォールバックし、混合ログも正常に表示されます。
強力なフィルタリング機能
複数のフィルタリング方式を内蔵:
| ショートカット | 機能 |
|---|---|
/ | グローバルテキスト検索 |
l | ログレベルでフィルタリング (DEBUG/INFO/WARN/ERROR) |
t | 時間範囲でフィルタリング |
f | 特定のフィールド値でフィルタリング |
r | すべてのフィルタ条件をリセット |
フィルタリングはリアルタイムで適用され、大規模なログファイルでもスムーズなインタラクティブ体験を維持します。
クイックスタート
# Homebrew でインストール
brew install hedhyw/tap/json-log-viewer
# またはプリコンパイル済みバイナリをダウンロード
wget https://github.com/hedhyw/json-log-viewer/releases/latest/download/json-log-viewer_linux_amd64
chmod +x json-log-viewer_linux_amd64
sudo mv json-log-viewer_linux_amd64 /usr/local/bin/jlv
# 使用
jlv /var/log/myapp/app.log
jlv < kubectl logs pod/myapp-xxx
kubectl logs -f pod/myapp-xxx | jlv
典型的なワークフロー
シナリオ 1:本番環境のエラー調査
# 最近の 1000 件のログを確認し、ERROR レベルをフィルタリング
kubectl logs --tail=1000 deployment/api | jlv
# その後 'l' を押して ERROR レベルを選択
シナリオ 2:特定ユーザーのリクエスト分析
# ログを開いた後、'f' でフィールドフィルタリング
# フィールド名を入力: user_id
# 値を入力: 12345
シナリオ 3:リアルタイムログ追跡
# パイプ入力をサポートし、リアルタイムで確認可能
tail -f /var/log/app.log | jlv
比較:json-log-viewer と他のツール
| ツール | Stars | ポジショニング | 主な差異 |
|---|---|---|---|
| jq | 30k+ | JSON 処理の強力ツール | 機能は充実しているが学習曲線が急、非インタラクティブ |
| fx | 20k+ | ターミナル JSON ビューア | インタラクティブ閲覧をサポートするが、単一 JSON 向けに設計 |
| grc | 5k+ | 汎用ログカラーリング | カラーリングのみ、構造化解析やフィルタリングは不可 |
| lnav | 6k+ | 高度なログビューア | 機能は充実しているが重め、システムログ向けに最適化 |
| json-log-viewer | 218 | JSON ログに特化 | 軽量、インタラクティブ、JSON 構造向けに最適化 |
json-log-viewer のポジショニングは明確です:汎用ツールになろうとせず、「ターミナルで JSON ログを表示する」ということを極限まで追求しています。
技術的なハイライト
Go + Bubble Tea のモダン TUI アーキテクチャ
プロジェクトは Go 言語エコシステムの新興 TUI 技術スタックを採用:
- Bubble Tea:The Elm Architecture の Go 実装、レスポンシブ UI 更新
- Bubbles:プリセットコンポーネントライブラリ(リスト、入力ボックス、ヘルプインターフェース)
- Lipgloss:宣言的スタイルシステム、CSS のようなターミナルスタイル
このアーキテクチャにより、コードは簡潔に保たれながら、モダンなターミナルアプリケーションにふさわしいインタラクティブ体験を提供しています。
大容量ファイルのストリーム処理
実装上は、一度に読み込むのではなくストリーム読み取りを採用:
// 擬似コード
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
entry := parseJSON(line)
if matchesFilter(entry) {
display(entry)
}
}
これにより、GB レベルのログファイルでも、すぐに開いて閲覧を開始できます。
適用シナリオ
- コンテナ化されたデプロイ環境:SSH でサーバーに接続後、コンテナログを素早く確認
- CI/CD パイプラインのデバッグ:ビルドログの構造化出力を分析
- マイクロサービスのログ追跡:複数サービスの JSON ログで問題を特定
- 開発時のデバッグ:ローカル実行時にアプリケーションログをリアルタイムで確認
現在の制限事項
- JSON のみサポート:プレーンテキストログはそのまま表示され、構造化の利点はない
- 永続化設定なし:起動時は常にデフォルト状態、よく使うフィルタの保存は不可
- 単一ファイル閲覧:複数ファイルを同時に開いて比較は不可
- コミュニティ規模が小さい:218 stars はユーザー基数が限定的であることを示し、エッジケースでは自分で調査が必要になる可能性がある
まとめ
json-log-viewer は「小さくて精巧」なツールです。万能型ログプラットフォームになろうとせず、一つの具体的な問題—ターミナルで JSON ログを効率的に表示すること—に集中しています。218 stars という小規模なサイズは逆にシンプルさを維持させています:過剰な機能はなく、設定の負担もなく、開いてすぐに使えます。
SSH セッションで構造化ログを頻繁に確認する必要がある場合、あるいは jq の記憶負担にうんざりしている場合、このツールはツールボックスに追加する価値があります。結局のところ、単純なシナリオを極限まで追求できるツールは、多機能なソリューションよりもしばしば信頼性が高いのです。
| 属性 | 内容 |
|---|---|
| リポジトリ | https://github.com/hedhyw/json-log-viewer |
| ライセンス | MIT |
| 言語 | Go |
| メンテナー | @hedhyw |