问题 Eclipse控制台 - 使堆栈跟踪可点击的规则是什么?


我记录了很多东西,并注意到Eclipse Console使Java堆栈跟踪可点击。异常突出显示(转到“创建断点”对话框),文件名+数字也会突出显示(允许直接转到该行)。

我想知道我是否可以格式化我的正常日志行,以便Eclipse Console对它们做同样的事情。一种可能的方法可能是使它们看起来像堆栈跟踪线,但为了保留尽可能多的信息,我想知道Eclipse用来检测这些行的确切规则,但Eclipse 3.6.2相当大,所以它是一项艰巨的任务。

那么问题是, 什么 是这里的规则,和 哪里 他们定义了吗?


编辑:回溯模式布局代码段 %msg \(%file:%line\)%n


4718
2018-03-08 13:12


起源

AFAIK,当eclipse检测到规范时 类名和java 文件名 被...围绕 ()  (喜欢 (Thread.java:50))它会自动使其可点击。默认。我见过一些插件也可以点击任何其他文件。 - bluefoot
你知道在Eclipse中这个定义的位置吗? - Thorbjørn Ravn Andersen
这也适用于IntelliJ(实际上在工作区中的源文件) - Thorbjørn Ravn Andersen


答案:


这个片段可能有所帮助。它可以放在代码中的任何位置,并在eclipse控制台上打印一条“可点击”的行:

StackTraceElement s = Thread.currentThread().getStackTrace()[1];
System.out.printf("%s.%s(%s:%s)%n", s.getClassName(), s.getMethodName(),
            s.getFileName(), s.getLineNumber());

更新:

这个问题有一个答案,可能包括您的问题的解决方案:

Eclipse控制台:检测警告和错误模式并使其可单击


我们走了:我们必须贡献一个实现 org.eclipse.ui.console.IPatternMatchListenerDelegate 通过延伸点 org.eclipse.ui.console.consolePatternMatchListeners

为堆栈跟踪中的异常和行号提供超链接的贡献在。中定义 org.eclipse.jdt.debug.ui 插件,实现类在同一个包中。

规则 是正则表达式,可以在 plugin.xml 贡献插件。


9
2018-03-08 13:33



谢谢回答。不过,我仍然希望看到实际的规则。 - Thorbjørn Ravn Andersen


如果你打印 (filename:lineNumber),Eclipse会将其转换为链接。

例:

System.out.println("message (Hello.java:2)");

我不知道是否有其他规则或它们的定义。


3
2018-03-08 13:27





那么问题是,这里的规则是什么,它们在哪里定义?

实际的正则表达式可以在这里找到: https://github.com/eclipse/eclipse.jdt.debug/blob/e7932c6319b3a96526134940ca57de0576e9607a/org.eclipse.jdt.debug.ui/plugin.xml#L3371

归结为类似的东西

\(\w*\.java:\S*\)

即只有括号部分匹配。 然后控制台将匹配委托给 org.eclipse.jdt.debug.ui.JavaConsoleTracker 这是一个实现 IPatternMatchListenerDelegate。这创造了相应的 IHyperlink (JavaStackTraceHyperlink)。只有在点击链接时才进行实际解析,再次读取整行以获取完整的包名等,然后在工作区中搜索。


如果像我这样的人需要在控制台之外实现这种行为(例如,使用 StyledText):

匹配链接与一些正则表达式,添加相应的 StyleRange (参见 SWT.UNDERLINE_LINK)将data属性设置为链接数据。单击,按包/类搜索工作区中的实际文件:

SearchEngine search = new SearchEngine();
NullProgressMonitor monitor = new NullProgressMonitor();
TypeNameMatchRequestor collector = result -> {
    IPath path = result.getType().getPath();
    //handle result, e.g. open editor
};
search.searchAllTypeNames(fullPackageName, SearchPattern.R_EXACT_MATCH, className, IJavaSearchConstants.TYPE, IJavaSearchConstants.TYPE, SearchEngine.createWorkspaceScope(), collector, IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, monitor);

1
2017-07-27 07:22





fullyQualifiedClassName.methodName(fileName:lineNumber)

没有 fullyQualifiedClassName,Eclipse可能会选择错误的文件。 methodName 匹配但不使用是必需的 - 它可以是任何东西。


0
2018-02-18 19:15