Ли Log.isLoggable возвращает неправильные значения?

Когда я писал обложку журнала для моего приложения для Android, я заметил странное поведение андроида Log.isLoggable. Выполнение следующего кода:

final String TAG = "Test";
Log.v(TAG, "verbose is active: " + Log.isLoggable(TAG, Log.VERBOSE));
Log.d(TAG, "debug is active: " + Log.isLoggable(TAG, Log.DEBUG));
Log.i(TAG, "info is active: " + Log.isLoggable(TAG, Log.INFO));
Log.w(TAG, "warn is active: " + Log.isLoggable(TAG, Log.WARN));
Log.e(TAG, "error is active: " + Log.isLoggable(TAG, Log.ERROR));

выводит следующий вывод LogCat:

VERBOSE/Test(598): verbose is active: false
DEBUG/Test(598): debug is active: false
INFO/Test(598): info is active: true
WARN/Test(598): warn is active: true
ERROR/Test(598): error is active: true

Почему я получаю подробные данные, а debug неактивен, хотя я создаю эти выходы с помощью подробного и отладочного журнала?

Ответ 1

Все уровни журналов записываются в logcat независимо от текущего уровня журнала. Метод isLogabble() может использоваться как оптимизация для ваших приложений, чтобы предотвратить отправку ненужных операторов журнала в logcat. Вы также можете использовать команду adb logcat для фильтрации подмножества уровней ведения журнала, даже если для ведения журнала задано подробное описание (см. https://developer.android.com/studio/debug/am-logcat.html).

Ответ 2

Если вы прочитали информацию о Log.isLoggable(), вы заметите, что уровень ведения журнала по умолчанию INFO. Все, что меньше (DEBUG и VERBOSE), приведет к возврату этого метода false. Вот почему ваш итоговый результат показывает эти два как false.

Все вызовы Log.* записываются в лог-код. Вызов Log.isLoggable() - это просто способ настроить ведение журнала. Это не требуется. Как правило, вы вызываете Log.isLoggable() до фактического вызова Log.*, чтобы определить, следует ли его регистрировать или нет.

Вы можете настроить регистрацию на TAG, если вы выберете, либо с помощью файла prop, либо через adb. Приятно отметить, что вы можете динамически включать и отключать ведение журнала вверх/вниз для каждого отдельного TAG в вашем приложении без необходимости вручную комментировать строки журнала или выполнять собственные проверки.

Ответ 3

Вы должны использовать

if (Log.isLoggable(TAG, Log.VERBOSE)) {
    Log.v(TAG, "verbose is active: " + Log.isLoggable(TAG, Log.VERBOSE));
}

Ответ 4

LOG всегда будет печататься в logcat независимо от того, что возвращает Log.isloggable().