18

是否可以使用 Timber 库记录当前行号和方法名称?

预期的 LogCat 结果:

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

5 回答 5

41

回答我自己的问题。

只需创建一个新的 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
        }
    }
}
于 2016-07-31T23:57:48.253 回答
33

改进了 Ismael Di Vita 的答案,因此它在 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 中用于在类之外进行日志记录

来自我的实用程序库

于 2018-03-11T03:38:07.877 回答
4

这就是我在我的应用程序类中使用 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}"
            }
        })
    }
}
于 2020-01-26T07:06:19.820 回答
2

我用这个类。

object Logg {
  private fun tag(): String? {
    return Thread.currentThread().stackTrace[4].let {
      val link = "(${it.fileName}:${it.lineNumber})"
      val path = "App# ${it.className.substringAfterLast(".")}.${it.methodName}"
      if (path.length + link.length > 80) {
        "${path.take(80 - link.length)}...${link}"
      } else {
        "$path$link"
      }
    }
  }

  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}")
    e?.printStackTrace()
  }

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

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

  fun e(e: Throwable?) {
    Log.e(tag(), " ${e?.localizedMessage}")
    e?.printStackTrace()
  }

  fun e(e: java.lang.Exception?) {
    Log.e(tag(), " ${e?.localizedMessage}")
    e?.printStackTrace()
  }
}

如何使用:

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

结果:

在此处输入图像描述

于 2020-03-21T08:48:21.783 回答
-4

你也可以使用我的库 https://github.com/farhad2161/betterlog

它将显示发生日志的方法名称。

输出将是这样的

e/MYTAG: [com.kia.betterlogapp.MainActivity.writeDummyLog][label1]I am error message
于 2017-10-18T08:24:46.770 回答