【发布时间】:2016-07-31 23:57:48
【问题描述】:
是否可以使用 Timber 库记录当前行号和方法名称?
预期的 LogCat 结果:
ismaeldivita.myapp I/[L:22] [M:onResume] [C:HomeActivity]: Praise the log!
【问题讨论】:
是否可以使用 Timber 库记录当前行号和方法名称?
预期的 LogCat 结果:
ismaeldivita.myapp I/[L:22] [M:onResume] [C:HomeActivity]: Praise the log!
【问题讨论】:
回答我自己的问题。
只需创建一个新的 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
}
}
}
【讨论】:
return String.format("[%s#%s:%s]", super.createStackElementTag(element), element.getMethodName(), element.getLineNumber()); 所以我们可以复制该代码,然后使用 CMD + O 导航到该代码。
.tag().d()样式设置自定义标签,这将不起作用,如createStackElementTag源代码注释中所述,即您需要删除.tag()才能使其工作。跨度>
onCreate中种树比把它们到处都聪明。
改进 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 中用于在类之外进行日志记录
来自我的utils 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 {
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 ==========")
结果:
【讨论】:
你也可以使用我的图书馆 https://github.com/farhad2161/betterlog
它将显示发生日志的方法名称。
输出会是这样的
e/MYTAG: [com.kia.betterlogapp.MainActivity.writeDummyLog][label1]I am error message
【讨论】: