Я предполагаю, что большинство из вас знает об android.util.Log. Все методы ведения журналов принимают «String tag» в качестве первого аргумента.
И мой вопрос: как вы обычно отмечаете свои журналы в своих приложениях? Я видел такой жесткий код:
public class MyActivity extends Activity {
private static final String TAG = "MyActivity";
//...
public void method () {
//...
Log.d(TAG, "Some logging");
}
}
Это выглядит не очень красиво по многим причинам:
- Вы можете сказать мне, что у этого кода нет жесткого кода, но он есть.
- В моем приложении могло быть любое количество классов в разных пакетах с одинаковым именем. Так что читать журнал будет сложно.
- Это не гибко. Вы всегда добавляли в свой класс приватное поле TAG.
Есть ли какой-нибудь изящный способ получить ТЕГ для класса?
Ответы:
Я использую TAG, но инициализирую его так:
Таким образом, когда я реорганизую свой код, тег также изменится соответствующим образом.
источник
"MyActivity.class.getName();"
. Я всегда думал, что "TAG" - это просто заполнитель в примерах из Google и т. Д., А не фактическаяStatic
переменная! Это гораздо лучшее решение, спасибо :)this.getClass().getName()
чтобы сделать ее более универсальной?Обычно я создаю
App
класс, который находится в другом пакете и содержит полезные статические методы. Один из методов - этоgetTag()
метод, таким образом я могу получить ТЕГ везде.App
класс выглядит так:РЕДАКТИРОВАТЬ : улучшено для каждого комментария моба br (спасибо :))
И когда я захочу его использовать:
Выходные данные
getTag
метода - это имя класса вызывающего (с именем пакета) и номер строки, из которойgetTag
вызывается, для облегчения отладки.источник
getStackTrace()
работает. Но я не буду использовать его, потому что это дорогоПерейдите в Android Studio -> Preference -> Live Templates -> AndroidLog, затем выберите Log.d (TAG, String) .
В тексте шаблона заменить
android.util.Log.d(TAG, "$METHOD_NAME$: $content$");
с участием
android.util.Log.d("$className$", "$METHOD_NAME$: $content$");
Затем нажмите « Изменить переменные» и введите className () в столбец Expression рядом со столбцом className Name .
Теперь, когда вы вводите ярлык,
logd
он помещаетВам больше не нужно определять ТЕГ.
источник
Мне нравится улучшать ответ Янива, если у вас есть журнал в этом формате (filename.java:XX) xx номер строки, вы можете связать ярлык таким же образом, как связывается при возникновении ошибки, таким образом я могу напрямую перейти к рассматриваемой строке просто щелкнув логарифм
Я поместил это в свое расширенное приложение, чтобы я мог использовать его в любом другом файле
Скриншот:
источник
AndroidStudio имеет
logt
шаблон по умолчанию (вы можете ввестиlogt
и нажать вкладку, чтобы развернуть его до фрагмента кода). Я рекомендую использовать это, чтобы избежать копирования и вставки определения TAG из другого класса и забыть изменить класс, о котором вы говорите. По умолчанию шаблон расширяется доprivate static final String TAG = "$CLASS_NAME$"
Чтобы избежать использования старого имени класса после рефакторинга, вы можете изменить его на
private static final String TAG = $CLASS_NAME$.class.getSimpleName();
Не забудьте проверить кнопку «Изменить переменные» и убедиться, что
CLASS_NAME
переменная определена для использованияclassName()
Выражения и для нее установлен флажок «Пропустить, если определено».источник
Я создал класс статических переменных, методов и классов с именем
S
.Ниже приводится метод регистрации:
Он вызывается в любом классе, так как
S.L(this, whaterver_object);
ThegetClass().getName()
также добавляет имя пакета, поэтому я удаляю его, чтобы не делать тег излишне длинным.Преимущества:
Log.d(TAG,
toString
Log.d
как мне просто нужно удалить метод, и местоположения всех журналов будут отмечены красным.CCC
(короткую, легко вводимую строку), так что в Android Studio легко отображать только ваши журналы на мониторе Android. Иногда вы запускаете службы или другие классы одновременно. Если вам нужно искать только по названию действия, вы не можете точно увидеть, когда был получен ответ службы, а затем произошло действие из вашей активности. Префикс, такой как CCC, помогает, поскольку он дает вам журналы в хронологическом порядке с активностью, в которой это произошло.источник
Context ctx
наObject ctx
иctx.getClass().getName().replace(ctx.getPackageName(), "")
наctx.getClass().getSimpleName()
. Таким образом, я могу звонитьS.L(Object, Object)
куда угодно (в том числе вFragment
s, которые не расширяютсяContext
, на мгновение).Вы можете использовать
this.toString()
для получения уникального идентификатора для конкретного класса, в котором вы печатаете в журнал.источник
toString()
.За счет обновления этих строк, когда я перемещаю код между методами или переименовываю методы, мне нравится делать следующее. С философской точки зрения также кажется, что лучше оставить в теге «местоположение» или «контекст», а не сообщение.
Преимущество здесь в том, что вы можете отфильтровать один метод, даже если содержимое не статично, например
Единственный недостаток заключается в том, что при переименовании
f()
вg()
нужно помнить об этой строке. Кроме того, автоматический рефакторинг IDE их не улавливает.Я имею в виду, что какое-то время я был поклонником использования короткого имени класса
LOG_TAG = MyClass.class.getSimpleName()
. Я обнаружил, что их труднее фильтровать в журналах, потому что там было меньше дел.источник
Это очень старый вопрос, но даже с учетом обновленного ответа на июль 2018 года предпочтительнее использовать Timber. Для правильного ведения журнала ошибки и предупреждения могут отправляться в сторонние библиотеки аварийного завершения, такие как Firebase или Crashlytics.
В класс, реализующий Application, вы должны добавить это:
Не забывайте о зависимости от древесины.
источник
Для тех пользователей, которые посещают этот вопрос:
источник
они используют Timber для приложения IOsched 2019 для отображения отладочной информации:
implementation 'com.jakewharton.timber:timber:4.7.1'
использование
обратите внимание, что это делает журналы доступными только во время состояния DEBUG и облегчает вам задачу удаления их вручную для запуска в Google Play -
ознакомьтесь с этой статьей https://medium.com/mindorks/better-logging-in-android-using-timber-72e40cc2293d
источник
Обычно я использую имя метода в качестве тега, но из потока
Это позволяет избежать нового исключения.
источник
источник
RuntimeException
только для того, чтобы получить имя текущего класса? Очень плохо.this.getClass().getName()
хотя вам придется удалить статическую область видимостиTAG