Записать название метода и номер строки в 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