Как вы обычно помечаете записи в журнале? (Андроид) - PullRequest
78 голосов
/ 02 декабря 2011

Я полагаю, что большинство из вас знают об 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 для класса?

Ответы [ 12 ]

159 голосов
/ 02 декабря 2011

Я использую TAG, но инициализирую его так:

private static final String TAG = MyActivity.class.getName();

Таким образом, при рефакторинге кода тег также будет соответствующим образом изменен.

12 голосов
/ 05 июля 2014

Я обычно создаю класс App, который находится в другом пакете и содержит полезные статические методы.Одним из методов является метод getTag(), таким образом я могу получить TAG везде.
App класс выглядит следующим образом:

РЕДАКТИРОВАТЬ : Улучшено за комментарий мобов (Спасибо :))

public class App {

    public static String getTag() {
        String tag = "";
        final StackTraceElement[] ste = Thread.currentThread().getStackTrace();
        for (int i = 0; i < ste.length; i++) {
            if (ste[i].getMethodName().equals("getTag")) {
                tag = "("+ste[i + 1].getFileName() + ":" + ste[i + 1].getLineNumber()+")";
            }
        }
        return tag;
    }

}

И когда я хочу использоватьit:

Log.i(App.getTag(), "Your message here");

Выход метода getTag - это имя класса вызывающего абонента (с именем пакета) и номер строки, из которой вызывается getTag, для упрощения отладки.

11 голосов
/ 08 декабря 2016

Перейдите на Android Studio -> Настройки -> Живые шаблоны -> AndroidLog , затем выберите Log.d (TAG, String) .

В Текст шаблона Заменить

android.util.Log.d(TAG, "$METHOD_NAME$: $content$");

с

android.util.Log.d("$className$", "$METHOD_NAME$: $content$");

Image of Android menu

Затем нажмите Изменить переменные и введите className () в столбце Выражение рядом со столбцом className Имя . image of Android menu 2

Теперь, когда вы набираете ярлык logd, он ставит

Log.d("CurrentClassName", "currentMethodName: ");

Вам больше не нужно определять TAG.

7 голосов
/ 17 марта 2015

Я хотел бы улучшить ответ Янива, если у вас есть журнал в этом формате (filename.java:XX) xx номер строки, с которой вы можете связать ярлык так же, как связывается при возникновении ошибки, таким образом я могу получить прямой доступ кв строке, просто нажав на logcat

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

public static String getTag() {
    String tag = "";
    final StackTraceElement[] ste = Thread.currentThread().getStackTrace();
    for (int i = 0; i < ste.length; i++) {
        if (ste[i].getMethodName().equals("getTag")) {
            tag = "("+ste[i + 1].getFileName() + ":" + ste[i + 1].getLineNumber()+")";
        }
    }
    return tag;
}

Снимок экрана:

3 голосов
/ 11 января 2017

Я создал класс статических переменных, методов и классов с именем S.

Ниже приведен метод ведения журнала:

public static void L(Context ctx, Object s) {
    Log.d("CCC " + ctx.getClass().getName().replace(ctx.getPackageName(), ""), s.toString());
}

Он вызывается в любом классе какS.L(this, whaterver_object); getClass().getName() также добавляет имя пакета, поэтому я удаляю его, чтобы избежать чрезмерной длины тега.

Преимущества:

  1. Короче Log.d(TAG,
  2. Нет необходимости преобразовывать значения int в их строку.На самом деле нет необходимости вводить toString
  3. Не забудьте удалить Log.d, так как мне просто нужно удалить метод, а расположение всех журналов помечается красным.
  4. Нет необходимостиопределить TAG в начале действия, так как оно принимает имя класса.
  5. TAG имеет префикс CCC (короткая, легко вводимая строка), так что его легко перечислить тольковаши логи в андроид мониторе в Android Studio.Иногда вы запускаете сервисы или другие классы одновременно.Если вам нужно выполнить поиск только по названию действия, вы не сможете точно определить, когда был получен ответ от службы, а затем произошло действие из вашего действия.Префикс, такой как ССС, помогает, поскольку он дает вам журналы в хронологическом порядке с деятельностью, в которой он произошел
2 голосов
/ 09 сентября 2017

AndroidStudio по умолчанию имеет шаблон logt (вы можете ввести logt и нажать tab, чтобы развернуть его до синтепета кода). Я рекомендую использовать это, чтобы не копировать вставку определения TAG из другого класса и забыть изменить класс, на который вы ссылаетесь. Шаблон расширяется по умолчанию до

private static final String TAG = "$CLASS_NAME$"

Чтобы избежать использования старого имени класса после рефакторинга, вы можете изменить его на

private static final String TAG = $CLASS_NAME$.class.getSimpleName();

Не забудьте проверить кнопку «Редактировать переменные» и убедиться, что переменная CLASS_NAME определена для использования выражения className() и имеет опцию «Пропустить, если определено».

2 голосов
/ 30 мая 2014

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

public class MyClass {

    // note this is ALWAYS private...subclasses should define their own
    private static final LOG_TAG = MyClass.class.getName();

    public void f() {
        Log.i(LOG_TAG + ".f", "Merry Christmas!");
    }

}

Преимущество здесь заключается в том, что вы можете отфильтровать один метод, даже если содержимоеЭто не статично, например,

Log.i(LOG_TAG + ".f", String.valueOf(new Random().nextInt()));

Единственный недостаток заключается в том, что когда я переименовываю f() в g(), мне нужно помнить эту строку.Кроме того, автоматический рефакторинг в IDE их не уловит.

Некоторое время я был поклонником использования короткого имени класса, я имею в виду LOG_TAG = MyClass.class.getSimpleName().Я нашел их труднее фильтровать в журналах, потому что было меньше, чтобы продолжить.

1 голос
/ 18 июля 2018

Это очень старый вопрос, но даже если обновленный ответ на июль 2018 года, то предпочтительнее использовать Timber. Для регистрации правильного ведения журнала ошибки и предупреждения можно отправлять сторонним библиотекам сбоев, таким как Firebase или Crashlytics.

В классе, который реализует Приложение , вы должны добавить это:

@Override
public void onCreate() {
    super.onCreate();
    if (BuildConfig.DEBUG) {
        Timber.plant(new Timber.DebugTree());
    } else {
        Timber.plant(new CrashReportingTree());
    }
}

/** A tree which logs important information for crash reporting. */
private static class CrashReportingTree extends Timber.Tree {
    @Override protected void log(int priority, String tag, String message, Throwable t) {
        if (priority == Log.VERBOSE || priority == Log.DEBUG) {
            return;
        }

        FakeCrashLibrary.log(priority, tag, message);

        if (t != null) {
            if (priority == Log.ERROR) {
                FakeCrashLibrary.logError(t);
            } else if (priority == Log.WARN) {
                FakeCrashLibrary.logWarning(t);
            }
        }
    }
}

Не забывайте зависимость от древесины.

implementation 'com.jakewharton.timber:timber:4.7.1'
1 голос
/ 02 декабря 2011

Вы можете использовать this.toString(), чтобы получить уникальный идентификатор для определенного класса, в котором вы печатаете в журнал.

0 голосов
/ 11 июня 2019

Для тех пользователей, которые посещают этот вопрос:

private val TAG:String = this.javaClass.simpleName;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...