[Android] Logcat に出る長大な JSON を読みやすくする 3 つの方法 — IDE 機能・コード・オンラインツール

「Logcat に出力された API レスポンスの JSON が、改行のない巨大な一行になっていて読めない…」これは Android 開発で日常的に遭遇する地味なストレスです。本記事では、Logcat に出る長大な JSON を読みやすくするための 3 つのアプローチを、すぐに使えるコード付きで紹介します。

結論から言うと、「コードで整形してから出力する」を基本にしつつ、単発の確認は「オンラインツールにコピペ」で補うのが現場で一番ストレスのない運用です。順に見ていきましょう。

スポンサーリンク

方法 1: コードで整形してから Log に出す

一番確実で、開発フェーズでデフォルトにすべきアプローチです。Log.d() に渡す前に、JSON を整形(プリティプリント)してから出力します。利用しているシリアライズライブラリごとに書き方を見ていきます。

1-1. kotlinx.serialization を使う場合

新規 Android プロジェクトで現在もっとも推奨されるのが kotlinx.serialization です。Json { prettyPrint = true } で整形済み出力が得られます。

import kotlinx.serialization.json.Json
import kotlinx.serialization.encodeToString
 
private val prettyJson = Json {
    prettyPrint = true
    prettyPrintIndent = "  " // 2スペースインデント(デフォルトは4スペース)
}
 
fun logUserResponse(user: User) {
    val output = prettyJson.encodeToString(user)
    Log.d("API", output)
}

prettyJson インスタンスは使い回せるので、トップレベルやシングルトンに置いて再利用すると効率的です。

1-2. Gson を使う場合

既存プロジェクトで Gson を使っているなら setPrettyPrinting() を有効にしたインスタンスを作ります。

import com.google.gson.GsonBuilder
 
private val prettyGson = GsonBuilder().setPrettyPrinting().create()
 
fun logUserResponse(user: User) {
    Log.d("API", prettyGson.toJson(user))
}

1-3. 標準ライブラリ(org.json)を使う場合

既に文字列として JSON を持っている場合や、サードパーティライブラリを増やしたくない場合は、Android に標準で含まれている org.json でも整形できます。

import org.json.JSONObject
 
val pretty = JSONObject(jsonString).toString(2) // 引数はインデント幅
Log.d("API", pretty)

ルートが配列の場合は JSONArray(jsonString).toString(2) を使います。

1-4. Logcat の文字数制限への対応(重要)

Android の Logcat は 1 メッセージあたり約 4000 文字 で切り詰められます。長い JSON をそのまま Log.d() に渡すと途中で切れてしまい、肝心な部分が見えないという罠があります。chunk 分割して複数行に分けて出力する必要があります。

これらをまとめて、プロジェクトに置いておくと便利な拡張ヘルパー関数を作ります。

import android.util.Log
import org.json.JSONArray
import org.json.JSONObject
 
object JsonLog {
    private const val MAX_CHUNK = 3000
 
    fun d(tag: String, jsonString: String) {
        if (!BuildConfig.DEBUG) return // リリースビルドでは何もしない
 
        val pretty = prettify(jsonString)
        if (pretty.length <= MAX_CHUNK) {
            Log.d(tag, pretty)
            return
        }
        pretty.chunked(MAX_CHUNK).forEachIndexed { index, chunk ->
            Log.d(tag, "[part ${index + 1}] $chunk")
        }
    }
 
    private fun prettify(jsonString: String): String = try {
        JSONObject(jsonString).toString(2)
    } catch (_: Exception) {
        try {
            JSONArray(jsonString).toString(2)
        } catch (_: Exception) {
            jsonString // 整形失敗時はそのまま返す
        }
    }
}

使い方はシンプルです。

// API レスポンスの文字列を渡すだけ
JsonLog.d("API", responseBody)

1-5. リリースビルドでは出力しない

JSON 整形には CPU コストがかかります。さらにログに API レスポンスが含まれた状態でリリースするのはセキュリティ的にも避けるべきです。上記サンプルの BuildConfig.DEBUG ガードのように、必ずデバッグビルドだけで動くようにしておくのが鉄則です。

Timber を使っているプロジェクトなら、Timber.DebugTree をデバッグビルドでのみ植えるのが一般的なパターンです。

// Application#onCreate()
if (BuildConfig.DEBUG) {
    Timber.plant(Timber.DebugTree())
}

方法 2: Android Studio の Logcat 機能を活用する

Android Studio の Logcat ビューにはいくつかの便利機能があります。残念ながらネイティブな JSON 整形機能はありませんが、以下を組み合わせると読みやすさが向上します。

  • Soft-Wrap(テキストの折り返し):Logcat ウィンドウのツールバーから「Soft-Wrap」を有効にすると、長い行が画面幅で折り返されて横スクロールが不要になります。
  • キーバリューのハイライト:検索ボックスに "user_id" のように入れると該当キーがハイライトされ、目的の値を素早く見つけられます。
  • メッセージのコピー:ログ行を右クリック → 「Copy Message」で本文だけをクリップボードへ(タイムスタンプやタグを除いて)。後述の方法 3 で使います。
  • キークエリでフィルタ:Logcat の検索ボックスに tag:API level:debug のように入れると、API ログだけを抽出できます。message:"user_id" のような本文検索も可能です。

ただ、これらはあくまで補助です。JSON そのものの整形は別途必要で、方法 1 か方法 3 と組み合わせる形になります。

方法 3: オンラインツールにコピペして整形・差分比較する

「整形コードを仕込むほどでもないけど、今この一回だけきれいに見たい」という場面では、ブラウザのオンラインツールが最速です。Logcat の長い JSON を選択 → コピー → ブラウザツールに貼り付けるだけで完了します。

特に重宝するのが 2 つの JSON を並べて差分比較できるツールです。たとえばこんなシーンで威力を発揮します。

  • API のバージョンを v1 → v2 に切り替えたら、レスポンスの構造が変わった気がするので diff を取りたい
  • 開発環境と本番環境で同じエンドポイントの返却値が異なる原因を調べたい
  • キャッシュ更新前後で同じレスポンスのはずなのに動作が変わったので、本当に同じか確認したい
  • QA から「特定のレコードだけ表示が崩れる」と報告があり、正常データと比較したい

こういったケースで「2 つを横並びにして、変わった行・変わった文字だけハイライト」が得られるとデバッグ時間が大幅に短縮されます。

当ブログにも JSON フォーマッター・差分比較ツール を用意しているので、お気軽にどうぞ。すべてブラウザ内で処理されるので、API レスポンスのような社外秘データを外部サーバーに送ってしまう心配がありません。

3 つの方法の使い分け

ざっくりした使い分けの目安はこうなります。

  • 開発中に常に整形済みのログを見たい(→ 方法 1)。プロジェクトに JsonLog のようなヘルパーを 1 つ置いておけば、毎回数行で済みます。
  • 既に出力済みの JSON ログを「今だけ」見たい・比較したい(→ 方法 3)。コードを増やさず、ブラウザでサッと処理。
  • ログ全体の流れを追ったり、特定タグでフィルタしたい(→ 方法 2)。整形ではなく「読み解き」のサポート。

実際の現場では、方法 1 をデフォルトにしつつ、方法 3 で差分比較を補う運用が一番ストレスがありません。方法 2 はあくまで Logcat ウィンドウを使いやすくするための土台として、常に有効化しておく感じです。

まとめ

Logcat に出る長大な JSON を読みやすくする 3 つの方法を紹介しました。

  1. コードで整形してから出力する(kotlinx.serialization / Gson / org.json)。文字数制限の chunk 対応と BuildConfig.DEBUG ガードを忘れずに。
  2. Android Studio の Logcat 機能(Soft-Wrap / フィルタ / 検索)を活用する。
  3. オンラインの JSON 整形・差分比較ツールに貼り付けて確認する。

地味な作業ですが、デバッグ効率に直結する部分です。プロジェクトに Pretty Print 用のログヘルパー関数を 1 つ用意しておくだけで、毎日の開発がだいぶ楽になります。ぜひ導入してみてください。

コメント

タイトルとURLをコピーしました