Уровень журнала android что это

Уровни журнала Android

Android поддерживает различные уровни журналов, Verbose, Debug, Info, Warn и Error. Я понимаю, как работают уровни ведения журнала; Меня больше интересует типичный результат, ожидаемый для заданного уровня.

Например, при разработке приложения мне может быть любопытно, когда какой-то метод что-то делает (это часто бывает для целей отладки). Я просмотрю журналы, чтобы убедиться, что методы вызываются в ожидаемом порядке, если сетевой ответ – это то, что, как я думаю, должно быть, если парсеры найдут нужную информацию и т. Д.

Почему кто-то использует Verbose vs Debug vs Info?

С точки зрения разработчика, для первого, второго или стороннего приложения не все журналы для целей отладки? (Предполагая, что разработчики не смотрят журналы для удовольствия … Я не такой садистский)

С точки зрения потребителя, когда s *** попадает в вентилятор, и им необходимо обратиться в службу поддержки клиентов, потому что их супер важное / деловое приложение не работает, разработчик использует журнал для целей отладки.

Единственная причина, по которой я мог видеть использование подробностей или информации, – это, вероятно, операции сбора данных / хранилища данных. Если да, зачем использовать verbose vs info.

Не уверен. Если я злоупотребляю этим или если инфраструктура андроида …

Я в основном следую тому, что должен сказать Томаш Нуркевич при рассмотрении уровня ведения журнала:

ОШИБКА – случилось что-то ужасное, что нужно немедленно расследовать. Никакая система не может переносить элементы, зарегистрированные на этом уровне. Пример: NPE, недоступная база данных, критически важный случай использования не может быть продолжен.

WARN – процесс может быть продолжен, но проявляйте особую осторожность. Пример: «Приложение, запущенное в режиме разработки» или «Консоль администрирования не защищена паролем». Приложение может переносить предупреждающие сообщения, но они всегда должны быть оправданы и проверены.

INFO – Важный бизнес-процесс завершен. В идеальном мире администратор или продвинутый пользователь должен понимать сообщения INFO и быстро узнать, что делает приложение. Например, если заявка касается бронирования авиабилетов, в каждом билете должно быть только одно заявление INFO, в котором говорится: «[Кто] забронировал билет с [Где] до [Где]». Другое определение сообщения INFO: каждое действие значительно изменяет состояние приложения (обновление базы данных, внешний системный запрос).

VERBOSE – очень подробная информация, предназначенная только для разработки. Вы можете сохранять сообщения трассировки в течение короткого периода времени после развертывания в рабочей среде, но относить эти операторы журнала как временные, которые должны или могут быть отключены в конечном итоге. Различие между DEBUG и VERBOSE является наиболее сложным, но если вы поместите инструкцию регистрации и удалите ее после того, как функция была разработана и протестирована, она, вероятно, должна быть на уровне VERBOSE.

Мой самый любимый уровень – WTF (2.2+), который, как предполагается, будет означать «Какая ужасная неудача», для ситуаций, которые никогда не должны происходить.

Обычно я использую «информацию» для простых сообщений.

Источник

Как включить / отключить уровни журнала в Android?

Например, у меня есть много операторов журнала для отладки.

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

18 ответов

Распространенный способ — создать int с именем loglevel и определить его уровень отладки на основе loglevel.

Позже вы можете просто изменить LOGLEVEL для всех уровней вывода отладки.

Verbose никогда не следует компилировать в приложение, кроме как во время разработки. Журналы отладки компилируются, но удаляются во время выполнения. Журналы ошибок, предупреждений и информации всегда ведутся.

Таким образом, вы можете рассмотреть возможность удаления отчетов подробного журнала, , возможно, с помощью ProGuard, как предложено в другом ответе .

Согласно документации, вы можете настроить ведение журнала на устройстве разработки с помощью свойств системы. Устанавливаемое свойство — log.tag. , и для него должно быть установлено одно из следующих значений: VERBOSE , DEBUG , INFO , WARN , ERROR , ASSERT или SUPPRESS . Дополнительная информация об этом доступна в документацию по методу isLoggable() .

Вы можете временно установить свойства с помощью команды setprop . Например:

В качестве альтернативы вы можете указать их в файле ‘/data/local.prop’ следующим образом:

Более поздние версии Android , похоже, требуют, чтобы /data/local.prop был доступен только для чтения . Этот файл читается во время загрузки, поэтому вам нужно будет перезагрузить его после обновления. Если /data/local.prop доступен для записи всем, он, скорее всего, будет проигнорирован.

Читайте также:  Голосом вызвать абонента андроид

Наконец, вы можете установить их программно, используя System.setProperty() метод.

Самый простой способ — это, вероятно, запустить ваш скомпилированный JAR через ProGuard перед развертыванием с такой конфигурацией, как:

Это — помимо всех других оптимизаций ProGuard — удалит все подробные операторы журнала непосредственно из байт-кода.

Я выбрал простой путь — создал класс-оболочку, который также использует списки переменных параметров.

Лучше всего использовать SLF4J API + некоторые его реализации.

Для приложений Android вы можете использовать следующее:

    Android Logger — это легкая, но простая в настройке реализация SLF4J ( 10

Удаление журнала с помощью proguard (см. Ответ от @Christopher) было простым и быстрым, но это привело к тому, что трассировки стека из производства не соответствовали источнику, если в файле была какая-либо запись отладки.

Вместо этого здесь используется метод, который использует разные уровни ведения журнала при разработке и производстве, предполагая, что proguard используется только в производственной среде. Он распознает производство, проверяя, переименовал ли proguard заданное имя класса (в этом примере я использую «com.foo.Bar» — вы должны заменить его на полное имя класса, которое, как вы знаете, будет переименовано proguard).

В этом методе используется обычное ведение журнала.

Log4j или slf4j также можно использовать в качестве фреймворков для ведения журналов в Android вместе с logcat. См. Проект android-logging-log4j или поддержка log4j в android

Существует крошечная замена стандартному классу журнала Android — https://github.com/zserge/log

По сути, все, что вам нужно сделать, это заменить импорт из android.util.Log на trikita.log.Log . Затем в вашем Application.onCreate() или в каком-нибудь статическом инициализаторе проверьте наличие BuilConfig.DEBUG или любого другого флага и используйте Log.level(Log.D) или Log.level(Log.E) , чтобы изменить минимальный уровень журнала. Вы можете использовать Log.useLog(false) , чтобы вообще отключить ведение журнала.

Это позволяет вам точно контролировать журналы. Вы можете, например, отключить все журналы или только журналы некоторых пакетов или классов.

Более того, он добавляет некоторые полезные функции (например, вам не нужно передавать тег для каждого журнала).

Я создал служебную программу / оболочку, которая решает эту проблему + другие распространенные проблемы с ведением журнала.

Утилита отладки со следующими функциями:

  • Обычные функции, предоставляемые классом Log, заключены в теги LogMode .
  • Журналы входа-выхода метода: могут быть отключены переключателем
  • Выборочная отладка: отладка определенных классов.
  • Измерение времени выполнения метода: измерение времени выполнения для отдельных методов, а также общее время, затраченное на все методы класса.
  • Включите класс в свой проект.
  • Для начала используйте его так же, как и методы android.util.Log.
  • Используйте функцию журналов входа-выхода, размещая вызовы методов entry_log () — exit_log () в начале и в конце методов в вашем приложении.

Я попытался сделать документацию самодостаточной.

Предложения по улучшению этой утилиты приветствуются.

Бесплатно использовать / делиться.

Загрузите его с GitHub.

Вот более сложное решение. Вы получите полную трассировку стека, а метод toString () будет вызываться только в случае необходимости (Производительность). Атрибут BuildConfig.DEBUG будет иметь значение false в производственном режиме, поэтому все журналы трассировки и отладки будут удалены. Компилятор горячих точек имеет возможность удалить вызовы из-за отключения конечных статических свойств.

В очень простом сценарии ведения журнала, когда вы буквально просто пытаетесь писать на консоль во время разработки для целей отладки, может быть проще всего просто выполнить поиск и заменить перед производственной сборкой и закомментировать все вызовы журнала или системы. out.println.

Например, если вы не использовали «Журнал». где бы то ни было, кроме вызова Log.d или Log.e и т. д., вы можете просто выполнить поиск и замену во всем решении, чтобы заменить «Журнал». с «// Журнал.» чтобы закомментировать все ваши вызовы журналирования, или в моем случае я просто везде использую System.out.println, поэтому перед тем, как перейти к производству, я просто сделаю полный поиск и заменю на «System.out.println» и заменю на «//System.out.println».

Я знаю, что это не идеально, и было бы неплохо, если бы возможность находить и комментировать вызовы Log и System.out.println были встроены в Eclipse, но до тех пор, пока это не произойдет, самый простой, быстрый и лучший способ сделать это — закомментировать поиском и заменить. Если вы сделаете это, вам не придется беспокоиться о несоответствии номеров строк трассировки стека, потому что вы редактируете исходный код и не добавляете никаких накладных расходов, проверяя конфигурацию уровня журнала и т. Д.

В моих приложениях у меня есть класс, который является оболочкой для класса журнала, который имеет статическую логическую переменную, называемую «состояние». На протяжении всего кода я проверяю значение переменной «состояния» с помощью статического метода перед фактической записью в журнал. Затем у меня есть статический метод для установки переменной «состояния», которая гарантирует, что значение будет общим для всех экземпляров, созданных приложением. Это означает, что я могу включить или отключить все ведение журнала для приложения за один вызов — даже когда приложение работает. Полезно для звонков в службу поддержки . Это означает, что вы должны придерживаться своих правил при отладке и не возвращаться к использованию стандартного класса журнала, хотя .

Читайте также:  Гонки карьера для андроид

Также полезно (удобно), что Java интерпретирует логическую переменную как false, если ей не было присвоено значение, что означает, что ее можно оставить как false, пока вам не понадобится включить ведение журнала 🙂

Мы можем использовать класс Log в нашем локальном компоненте и определить методы как v / i / e / d. При необходимости мы можем позвонить и дальше.
пример показан ниже.

Здесь сообщение для string , а args — это значение, которое вы хотите напечатать.

Для меня часто бывает полезно установить разные уровни ведения журнала для каждого тега.

Я использую этот очень простой класс-оболочку:

Теперь просто установите уровень журнала для каждого тега в начале каждого класса:

Другой способ — использовать платформу ведения журналов, которая позволяет открывать и закрывать журналы. Иногда это может дать большую гибкость даже в производственном приложении, какие журналы должны быть открыты, а какие закрыты, в зависимости от того, какие проблемы у вас есть, например:

  • Дровосек
  • Shipbook (отказ от ответственности: я являюсь автором этого пакета)

Прочтите, пожалуйста, эту статью, где дается полный комплект:

Источник

Как включить/отключить уровни журналов в Android?

У меня есть множество операторов регистрации для отладки, например.

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

ОТВЕТЫ

Ответ 1

Общим способом является создание имени именованного логического уровня и определение его уровня отладки на основе loglevel.

Позже вы можете просто изменить LOGLEVEL для всех уровней вывода отладки.

Ответ 2

Verbose никогда не следует компилировать в приложение, кроме как во время разработки. Журналы отладки компилируются, но удаляются во время выполнения. Журналы ошибок, предупреждений и информации всегда сохраняются.

Таким образом, вы можете захотеть удалить дескрипторы журнала Verbose, возможно, используя ProGuard, как это предлагается в другом ответе.

В соответствии с документацией вы можете настроить ведение журнала на устройстве разработки с помощью System Properties. Свойство для установки равно log.tag. , и оно должно быть установлено на одно из следующих значений: VERBOSE , DEBUG , INFO , WARN , ERROR , ASSERT или SUPPRESS . Дополнительная информация об этом доступна в документации для метода isLoggable() .

Вы можете временно установить свойства, используя команду setprop . Например:

В качестве альтернативы вы можете указать их в файле ‘/data/local.prop’ следующим образом:

В более поздних версиях Android требуется, чтобы /data/local.prop был доступен только для чтения. Этот файл читается во время загрузки, поэтому вам необходимо перезапустить его после его обновления. Если /data/local.prop доступен для записи в мире, он, вероятно, будет проигнорирован.

Наконец, вы можете установить их программно, используя метод System.setProperty() .

Ответ 3

Самый простой способ — запустить ваш скомпилированный JAR через ProGuard перед развертыванием с конфигурацией вроде:

Это будет — кроме всех других оптимизаций ProGuard — удалите любые подробные записи журнала непосредственно из байт-кода.

Ответ 4

Я сделал простой маршрут — создав класс-оболочку, который также использует списки переменных параметров.

Ответ 5

Лучше всего использовать API SLF4J + часть его реализации.

Для приложений Android вы можете использовать следующее:

    Android Logger — это легкая, но простая в использовании реализация SLF4J (

Ответ 6

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

Ответ 7

Удаление журнала с помощью proguard (см. ответ от @Christopher) было простым и быстрым, но оно вызвало трассировку стека из производства, чтобы не соответствовать источнику, если в файле было зарегистрировано отладочное ведение журнала.

Вместо этого здесь используется метод, который использует разные уровни регистрации в процессе разработки или производства, предполагая, что proguard используется только в производстве. Он распознает производство, увидев, что proguard переименовал данное имя класса (в примере я использую «com.foo.Bar» — вы замените это на полностью квалифицированное имя класса, которое, как вы знаете, будет переименовано proguard).

В этом методе используется запись в сообществах.

Ответ 8

Log4j или slf4j также могут использоваться в качестве фреймворков регистрации в Android вместе с logcat. См. Проект android-logging-log4j или поддержка log4j в android

Ответ 9

Существует небольшая замена для стандартного класса Android Android — https://github.com/zserge/log

В основном все, что вам нужно сделать, это заменить импорт с android.util.Log на trikita.log.Log . Затем в Application.onCreate() или в каком-то статическом инициализаторе проверьте BuilConfig.DEBUG или любой другой флаг и используйте Log.level(Log.D) или Log.level(Log.E) , чтобы изменить минимальный уровень журнала. Вы можете использовать Log.useLog(false) , чтобы вообще отключить ведение журнала.

Читайте также:  Android google mobile service apps

Ответ 10

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

Кроме того, он добавляет некоторые полезные функции (например, вам не нужно передавать тег для каждого журнала).

Ответ 11

Вот более сложное решение. Вы получите полную трассировку стека, и метод toString() будет вызываться только при необходимости (Performance). Атрибут BuildConfig.DEBUG будет ложным в рабочем режиме, поэтому все журналы трассировки и отладки будут удалены. Компилятор горячей точки имеет возможность удалить вызовы из-за окончательных статических свойств.

Ответ 12

Я создал утилиту /Wrapper, которая решает эту проблему + другие общие проблемы, связанные с журналом.

Утилита отладки со следующими функциями:

  • Обычные функции, предоставляемые классом Log, обернутые LogMode s.
  • Журнал ввода-выхода метода: может быть отключен коммутатором
  • Селективная отладка: отладка определенных классов.
  • Измерение времени выполнения метода: измерение времени выполнения для отдельных методов, а также коллективное время, потраченное на все методы класса.
  • Включите класс в свой проект.
  • Используйте его, как вы используете методы android.util.Log, для начала.
  • Используйте функцию журналов Entry-Exit, разместив вызовы методов entry_log() — exit_log() в начале и конце методов в вашем приложении.

Я попытался сделать документацию самодостаточной.

Предложения по улучшению этой утилиты приветствуются.

Загрузите его из GitHub.

Ответ 13

В очень простом сценарии ведения журнала, где вы буквально просто пытаетесь писать на консоль во время разработки для целей отладки, проще всего просто выполнить поиск и заменить перед вашей производственной сборкой и прокомментировать все вызовы в журнал или System.out.println.

Например, если вы не используете «Журнал». где-либо вне вызова Log.d или Log.e и т.д., вы можете просто найти и заменить все решение для замены «Log». с «//Log». прокомментировать все ваши вызовы регистрации, или, в моем случае, я просто использую System.out.println всюду, поэтому, прежде чем приступать к производству, я просто сделаю полный поиск и замените для «System.out.println» и заменим на «//System.out.println».

Я знаю, что это не идеально, и было бы неплохо, если бы способность находить и прокомментировать вызовы Log и System.out.println были встроены в Eclipse, но до тех пор, пока это не будет самым простым и быстрым и лучшим способом сделайте это, чтобы прокомментировать поиск и заменить. Если вы это сделаете, вам не нужно беспокоиться о несоответствии номеров строк трассировки стека, потому что вы редактируете исходный код, и вы не добавляете никаких накладных расходов, проверяя конфигурацию уровня журнала и т.д.

Ответ 14

В моих приложениях у меня есть класс, который обертывает класс журнала, который имеет статический логический var, называемый «state». Во всем моем коде я проверяю значение переменной «состояние», используя статический метод, прежде чем писать в журнал. Затем у меня есть статический метод для установки переменной состояния, которая гарантирует, что значение является общим для всех экземпляров, созданных приложением. Это означает, что я могу включить или отключить все протоколирование для приложения одним звонком — даже когда приложение запущено. Полезно для вызовов поддержки. Это означает, что вы должны придерживаться своего оружия при отладке, а не регрессировать, чтобы использовать стандартный класс журнала, хотя.

Также полезно (удобно), что Java интерпретирует логический var как false, если ему не присвоено значение, что означает, что он может быть оставлен как false до тех пор, пока вам не понадобится включить ведение журнала: -)

Ответ 15

Мы можем использовать класс Log в нашем локальном компоненте и определить методы как v/i/e/d. Основываясь на необходимости, мы можем позвонить дальше.
пример показан ниже.

здесь сообщение для string , а args — это значение, которое вы хотите распечатать.

Ответ 16

Для меня часто бывает полезно установить разные уровни журналов для каждой TAG.

Я использую этот очень простой класс-оболочку:

Теперь просто установите уровень журнала на TAG в начале каждого класса:

Ответ 17

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

Ответ 18

Однако System.setProperty() хранит совершенно другой набор свойств по сравнению со свойствами, доступ к которым может получить команда getprop которая может быть выдана в оболочке ADB. Следовательно, даже если вы попытаетесь использовать System.setProperty() для хранения уровня журнала для тега, он не будет работать.

Как уже упоминалось, вы можете использовать adb shell setprop

Источник

Оцените статью