【问题标题】:Log method name and line number in Timber在 Timber 中记录方法名称和行号
【发布时间】:2016-07-31 23:57:48
【问题描述】:

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

预期的 LogCat 结果:

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

【问题讨论】:

    标签: android timber-android


    【解决方案1】:

    回答我自己的问题。

    只需创建一个新的 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中种树比把它们到处都聪明。
    【解决方案2】:

    改进 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

    【讨论】:

      【解决方案3】:

      这就是我在我的应用程序类中使用 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}"
                  }
              })
          }
      }
      

      【讨论】:

        【解决方案4】:

        我使用这个类。

        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 ==========")
        

        结果:

        【讨论】:

          【解决方案5】:

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

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

          输出会是这样的

          e/MYTAG: [com.kia.betterlogapp.MainActivity.writeDummyLog][label1]I am error message
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-10-19
            • 1970-01-01
            • 2023-03-20
            • 1970-01-01
            • 1970-01-01
            • 2015-06-17
            • 1970-01-01
            相关资源
            最近更新 更多