Баг или фича в android.util.Log? - Log.isLoggable (DEBUG) = false, но Log.d () не отключен - PullRequest
5 голосов
/ 27 февраля 2012

Обновление: переформулировал вопрос и заголовок:

Я всегда думал, что дорогостоящие методы ведения журнала Android можно оптимизировать, спрашивая, активно ли ведение журнала, как это

    import android.util.Log;

    if (Log.isLoggable("MyContext", Log.DEBUG))
    {
        Log.d("MyContext", "my logging: " + callExpensiveCalculation());
    }

Однако при попытке этого сэмулятор Android 2.2 мой Log.d () никогда не вызывается.

Так что я попробовал этот код

    Log.v(MY_CONTEXT, "VERBOSE logging is active: " + Log.isLoggable(MY_CONTEXT, Log.VERBOSE));
    Log.d(MY_CONTEXT, "DEBUG logging is active: " + Log.isLoggable(MY_CONTEXT, Log.DEBUG));
    Log.i(MY_CONTEXT, "INFO logging is active: " + Log.isLoggable(MY_CONTEXT, Log.INFO));
    Log.w(MY_CONTEXT, "WARN logging is active: " + Log.isLoggable(MY_CONTEXT, Log.WARN));
    Log.e(MY_CONTEXT, "ERROR logging is active: " + Log.isLoggable(MY_CONTEXT, Log.ERROR));

и, к моему удивлению, я получил

02-27 19:05:43.015: V/MyContext(334): VERBOSE logging is active: false
02-27 19:05:43.015: D/MyContext(334): DEBUG logging is active: false
02-27 19:05:43.015: I/MyContext(334): INFO logging is active: true
02-27 19:05:43.015: W/MyContext(334): WARN logging is active: true
02-27 19:05:43.015: E/MyContext(334): ERROR logging is active: true

такведение журнала работает, даже если ведение журнала отключено.Это ошибка в Android или в моем тестовом коде?

Есть ли другой способ узнать, активна ли отладка (или один из других уровней логирования) или нет?

Я используюeclipse logcat-view с подробным уровнем журнала и запустил тест из eclipse с запуском как android-app

1 Ответ

3 голосов
/ 18 января 2013

isLoggable на самом деле просто механизм для предоставления флага для определенных тегов для вашего удобства.Это на самом деле ничего не делает, чтобы отключить ведение журнала.Ваш первый блок кода правильный:

if (Log.isLoggable("MyContext", Log.DEBUG))
{
    Log.d("MyContext", "my logging: " + callExpensiveCalculation());
}

Это будет регистрировать или не регистрировать в зависимости от того, вернет ли isLoggable true или false.Однако, когда вы делаете это (без проверки isLoggable):

Log.d(MY_CONTEXT, "DEBUG logging is active: " + Log.isLoggable(MY_CONTEXT, Log.DEBUG));

Он будет регистрироваться независимо от того, что вернул бы isLoggable, если бы вы его вызвали.Короче говоря, вам нужно , чтобы выполнять эту проверку везде, где вы регистрируетесь, если вы хотите включить / отключить ведение журнала на основе этого флага.Оператор if - это часть, которая позволяет пропускать ненужные журналы.Если if предложение false, код внутри никогда не запускается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...