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())
}
}