Записать название метода и номер строки в Timber

Можно ли записать текущий номер строки и имя метода с помощью библиотеки Timber?

Ожидаемый результат LogCat:

ismaeldivita.myapp I/[L:22] [M:onResume] [C:HomeActivity]: Praise the log!

6 ответов

Решение

Отвечая на мой собственный вопрос.

Просто создайте новый класс DebugTree

public class MyDebugTree extends Timber.DebugTree {    
    @Override
    protected String createStackElementTag(StackTraceElement element) {
        return String.format("[L:%s] [M:%s] [C:%s]",
                element.getLineNumber(),
                element.getMethodName(),
                super.createStackElementTag(element));
    }
}

И посадите свое дерево в древесине:

public class App extends Application {
    @Override
    public void onCreate(){
        super.onCreate();
        if (BuildConfig.DEBUG) {
           Timber.plant(new MyDebugTree());
        } else {
           //TODO plant your Production Tree
        }
    }
}

Улучшается ответ Исмаила Ди Виты, поэтому он отображается в logcat в виде гиперссылки, подобной этой.

public class MyDebugTree extends Timber.DebugTree {     
    @Override 
    protected String createStackElementTag(StackTraceElement element) {
        return String.format("(%s:%s)#%s",
            element.getFileName(),
            element.getLineNumber(),
            element.getMethodName());
    } 
} 

или для котлина

class LineNumberDebugTree : Timber.DebugTree() {
override fun createStackElementTag(element: StackTraceElement): String? {
    return "(${element.fileName}:${element.lineNumber})#${element.methodName}"
}

}

Примечание: используйте element.fileName вместо element.className, чтобы он работал в kotlin для регистрации вне класса

из моей утилиты lib

Вот как я решил это в своем классе приложения с помощью Kotlin:

class App : Application() {

override fun onCreate() {
    super.onCreate()
    initLogger()
}

private fun initLogger() {
    if (BuildConfig.DEBUG) {
        Timber.plant(object : Timber.DebugTree() {
            override fun createStackElementTag(element: StackTraceElement): String? {
                return "(${element.fileName}:${element.lineNumber})#${element.methodName}"
            }
        })
    }
}

Пользуюсь этим классом.

object Logg {
  private fun tag(): String? {
    return Thread.currentThread().stackTrace[4].let {
      "App# ${it.className.substringAfterLast(".")}.${it.methodName}(${it.fileName}:${it.lineNumber})"
    }
  }

  fun v(msg: String?) {
    Log.v(tag(), "" + msg)
  }

  fun d(msg: String?) {
    Log.d(tag(), "" + msg)
  }

  fun i(msg: String?) {
    Log.i(tag(), "" + msg)
  }

  fun w(msg: String?) {
    Log.w(tag(), "" + msg)
  }

  fun w(e: Throwable?) {
    Log.w(tag(), "" + e?.localizedMessage)
  }

  fun w(e: Exception?) {
    Log.w(tag(), "" + e?.localizedMessage)
  }

  fun e(msg: String?) {
    Log.e(tag(), "" + msg)
  }
}

Как использовать:

Logg.e("====== log here ==========")

Результат:

Расширение ответа Ugurcan Yildirim, поэтому он также обрабатывает имена лямбда-методов.

                  @Override
            protected String createStackElementTag(@NonNull StackTraceElement element) {
                String mName=element.getMethodName();
                if(mName.startsWith("lambda$")){
                    String[] frames = mName.split("\\$");
                    if(frames.length>2){
                        mName = frames[0] + "$"+ frames[1];
                    }
                }
                String x = String.format("(%s:%s)#%s",element.getFileName(),element.getLineNumber(),mName);
                return x;
            }

Без вышеуказанного исправления для журналов, где возвращает имя_метода, например lambda$onCreate$8$com-swiftthoughts-wordkons-ActivityStartJoinGameжурнал отладки отображается в журнале cat как

[

С вышеуказанными изменениями это выглядит так, как ожидалось

Вы также можете использовать мою библиотеку https://github.com/farhad2161/betterlog

Он покажет имя метода, где произошли журналы.

На выходе будет что-то вроде этого

e/MYTAG: [com.kia.betterlogapp.MainActivity.writeDummyLog][label1]I am error message
Другие вопросы по тегам