Ли 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().