json-log-viewer:218⭐のインタラクティブ JSON ログビューア

マイクロサービスとコンテナ化の時代、JSON 形式の構造化ログは標準となっています。しかし、サーバー上でこれらのログを素早く確認する必要がある場合、生の JSON の可読性はしばしば低くなります。json-log-viewer はわずか 218 stars の小規模なツールで、Go 言語で書かれ、Bubble Tea TUI フレームワークをベースに、コマンドライン環境にインタラクティブな JSON ログ閲覧体験を提供します。

プロジェクト概要

属性内容
GitHubhedhyw/json-log-viewer
Stars218
言語Go
特徴インタラクティブ TUI、リアルタイムフィルタリング、複数形式解析
最終更新2週間前

解決する問題

JSON ログを処理する際、開発者はしばしば以下の悩みに直面します:

  • cattail で直接確認すると、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ポジショニング主な差異
jq30k+JSON 処理の強力ツール機能は充実しているが学習曲線が急、非インタラクティブ
fx20k+ターミナル JSON ビューアインタラクティブ閲覧をサポートするが、単一 JSON 向けに設計
grc5k+汎用ログカラーリングカラーリングのみ、構造化解析やフィルタリングは不可
lnav6k+高度なログビューア機能は充実しているが重め、システムログ向けに最適化
json-log-viewer218JSON ログに特化軽量、インタラクティブ、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