Android 如何在LogCat中插入一个日志,当我点击它时,它会跳转到代码中的行?

Android 如何在LogCat中插入一个日志,当我点击它时,它会跳转到代码中的行?,android,eclipse,logcat,Android,Eclipse,Logcat,我想在LogCat中插入一个日志,当我点击它时,它会跳转到它的行,就像系统生成的一些错误日志一样 有可能吗?使用是的,你能做到。。按照我在上找到的示例进行操作: public static void showLogCat(String tag, String msg) { StackTraceElement[] stackTraceElement = Thread.currentThread() .getStackTrace();

我想在LogCat中插入一个日志,当我点击它时,它会跳转到它的行,就像系统生成的一些错误日志一样


有可能吗?

使用

是的,你能做到。。按照我在

上找到的示例进行操作:

public static void showLogCat(String tag, String msg) {

        StackTraceElement[] stackTraceElement = Thread.currentThread()
                .getStackTrace();
        int currentIndex = -1;
        for (int i = 0; i < stackTraceElement.length; i++) {
            if (stackTraceElement[i].getMethodName().compareTo("showLogCat") == 0)
            {
                currentIndex = i + 1;
                break;
            }
        }

        String fullClassName = stackTraceElement[currentIndex].getClassName();
        String className = fullClassName.substring(fullClassName
                .lastIndexOf(".") + 1);
        String methodName = stackTraceElement[currentIndex].getMethodName();
        String lineNumber = String
                .valueOf(stackTraceElement[currentIndex].getLineNumber());

        Log.i(tag, msg);
        Log.i(tag + " position", "at " + fullClassName + "." + methodName + "("
                + className + ".java:" + lineNumber + ")");

    }

重要的是在日志消息中插入
(X:Y)
,而
X
是您所需的文件名,
Y
是您在
X
中所需的行号(我从中了解到)。因此,请尝试:

公共静态无效日志(最终字符串标记,最终字符串消息){
final StackTraceElement stackTrace=新异常().getStackTrace()[1];
String fileName=stackTrace.getFileName();
if(fileName==null)fileName=“;//如果要使用proguard模糊处理,则必须这样做。
最终字符串信息=stackTrace.getMethodName()+“(“+fileName+”:”
+stackTrace.getLineNumber()+”;
日志级别(标记,信息+”:“+msg);
}
注意
级别
是日志级别,可以是
v
d
i
w
e
wtf

现在您可以使用
log(tag,msg)
而不是
log.LEVEL(tag,msg)


例如:

MainActivity.java

。。。
公共类MainActivity扩展了BaseActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
日志(“测试标签”,“你好世界!”);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
...
输出:

12-30 14:24:45.343?I/Test标签:onCreate(MainActivity.java:10):你好,世界!
MainActivity.java:10
将自动成为一个,您可以点击它


如果需要更详细的日志,还可以将以下值指定给
info
变量:

final String info=stackTrace.getClassName()+“+stackTrace.getMethodName()+”(“
+文件名+“:“+stackTrace.getLineNumber()+”)\n”;
因此,上述示例的输出为:

12-30 14:33:07.360?I/Test标签:com.example.myapp.MainActivity.onCreate(MainActivity.java:11)
你好,世界!
用简单的方式回答问题: 尊敬的塞特·雷格尔:

{FileName}.{ext}:{LigneNumber}

e.g. MainActivity.java:10
下面是一个例子

Log.d(TAG, "onResume: MainActivity.java:10");

我希望这将对您有所帮助

这并不是问题的答案,但也许这是一个“足够接近”的解决方法

  • 突出显示日志文本
  • 按CTRL-SHIFT-F键
  • 双击搜索结果
  • 如果文本在按下CTRL-SHIFT-F键之前高亮显示,则无需键入或复制/粘贴。

    如果搜索结果太多,可以使用live模板创建唯一的logcat条目:

    创建活动模板以插入类、方法和行号(在编写时)。我使用“logi”。是的,行号会随着您继续编写而变得越来越不准确,但它仍然可以作为一种使日志条目更“可查找”的方式


    请将这棵树与木材一起使用

    class MyLinkingTimberTree : Timber.DebugTree() {
        override fun createStackElementTag(element: StackTraceElement): String? {
            return makeClickableLineNumber(element)
        }
    
        private fun makeClickableLineNumber(
            element: StackTraceElement
        ): String {
            val className = element.fileName
            val methodName = element.methodName
            val lineNumber = element.lineNumber
            val fileName = element.fileName
            val stringBuilder = StringBuilder(className)
            .append(".")
            .append(methodName)
            .append(" (")
            .append(fileName)
            .append(":")
            .append(lineNumber)
            .append(")  ")
            return stringBuilder.toString()
        }
    }
    
    然后像这样实例化它:

    class MyApplication: Application() {
    
        override fun onCreate() {
            super.onCreate()
            if(BuildConfig.DEBUG) {
                Timber.plant(MyLinkingTimberTree())
            }
        }
    }
    
    然后,正常使用木材:

    Timber.d("Currently Signed in:")
    
    这就是结果。很好,不是吗?我希望你喜欢使用它,就像我喜欢制作它一样


    跳转到该行没有任何意义如果我从activity或fragment以外的其他位置调用您的方法,它会在StackTraceeElement[currentIndex].getClassName()上提供ArrayIndexOutOfBoundsException;
    Timber.d("Currently Signed in:")