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

时间:2012-05-15 09:15:54

标签: android eclipse logcat

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

有可能吗?

7 个答案:

答案 0 :(得分:14)

我找到了它:

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 + ")");

    }

用法:

showLogCat("tag", "message");

答案 1 :(得分:4)

重要的是在您的日志消息中插入"(X:Y)",而X是您想要的文件名Y是您想要的< X中的em>行号。 (我是从@breceivemail's answer了解到的)。所以试试:

public static void log(final String tag, final String msg) {
    final StackTraceElement stackTrace = new Exception().getStackTrace()[1];

    String fileName = stackTrace.getFileName();
    if (fileName == null) fileName="";  // It is necessary if you want to use proguard obfuscation.

    final String info = stackTrace.getMethodName() + " (" + fileName + ":"
            + stackTrace.getLineNumber() + ")";

    Log.LEVEL(tag, info + ": " + msg);
}

注意LEVEL是日志级别,可以是vdiw,{ {1}}或e

现在,您可以使用wtf代替log(tag, msg)

示例:

<强> MainActivity.java

Log.LEVEL(tag, msg)

输出:

...
public class MainActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        log("Test Tag", "Hello World!");

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
    ...

12-30 14:24:45.343 ? I/Test Tag: onCreate (MainActivity.java:10): Hello World! 自动成为link,您可以点击它!

如果您想要更详细的日志,还可以将以下值分配给MainActivity.java:10变量:

info

所以上面例子的输出是:

final String info = stackTrace.getClassName() + "." + stackTrace.getMethodName() + " ("
            + fileName + ":" + stackTrace.getLineNumber() + ")\n";

答案 2 :(得分:0)

是的,你可以这样做。按照SO - logging

上的回答示例

答案 3 :(得分:0)

以简单的方式回答问题:

respectercetterègle:

{FileName}.{ext}:{LigneNumber}

e.g. MainActivity.java:10

给出如下样本

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

我希望这会对你有所帮助

答案 4 :(得分:0)

这并不是对问题的完全回答,但也许是“足够接近”的解决方法。

  1. 突出显示日志文本
  2. 按CTRL-SHIFT-F
  3. 双击搜索结果。

如果在按CTRL-SHIFT-F之前突出显示文本,则无需键入或复制/粘贴文本。
screenshot of Search Results

如果您的搜索倾向于产生太多结果,则可以使用实时模板来创建唯一的logcat条目:

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

Screenshot of Live Template

答案 5 :(得分:0)

请将此树与木材一起使用。

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:

Timber.d("Currently Signed in:")

这就是结果。很好,不是吗?希望您喜欢它,也喜欢它! ;)

Logcat with a link!

答案 6 :(得分:-1)