1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Android のログについての記事になります。

ログは、動作確認や不具合解析には有効ですが、セキュリティやパフォーマンスの観点からリリース時には出力内容を検討する必要があります。

私もリリース時は、DEBUG レベル以下のログは出力しないようにしています。

Logger.kt
object Logger {
        private const val TAG = "myApp"
    private const val DEBUG = false

    fun e(msg: String) { Log.e(TAG, msg) }
    fun w(msg: String) { Log.w(TAG, msg) }
    fun i(msg: String) { Log.i(TAG, msg) }
    fun d(msg: String) { if (DEBUG) { Log.d(TAG, msg) } }
    fun v(msg: String) { if (DEBUG) { Log.d(TAG, msg) } }
}

ログの出し分け

Log#isLoggable を使用する方法もあります。

    fun d(msg: String) {
        if (Log.isLoggable(TAG, Log.DEBUG)) {
            Log.d(TAG, msg)
        }
    }

    fun v(msg: String) {
        if (Log.isLoggable(TAG, Log.VERBOSE)) {
            Log.v(TAG, msg)
        }
    }

上記の様にすることで、実行時にレベルを変更できます。
下記のコマンドを打つと、VERBOSE のログが表示されます。

adb shell setprop log.tag.myApp VERBOSE

tag をクラス毎、機能毎にすることで、さらに細かいログの出し分けも可能となります。

    Logger.d("MainActivity", "onCreate")

    fun d(tag: String, msg: String) {
        if (Log.isLoggable(tag, Log.DEBUG)) {
            Log.d(TAG, msg)
        }
    }

パフォーマンス

細かい話をすると、文字列の結合はパフォーマンスに影響が出るので、文字列の結合部分をラムダ式にすることで、ログを出力しないときは、結合処理を行わせないことも可能となります。

    Logger.d { "setOnItemClickListener($position)" }

    fun d(block: () -> String) {
        if (Log.isLoggable(TAG, Log.DEBUG)) {
            Log.d(TAG, block())
        }
    }
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?