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

时间:2011-03-08 13:12:01

标签: java eclipse logging console

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

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

问题是, 是什么在这里发挥作用, 是在哪里定义的?


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

4 个答案:

答案 0 :(得分:9)

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

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

<强>更新

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

Eclipse console: detect warning and error patterns and make them clickable


我们开始:我们必须通过扩展点org.eclipse.ui.console.IPatternMatchListenerDelegate提供org.eclipse.ui.console.consolePatternMatchListeners的实施。

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

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

答案 1 :(得分:3)

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

示例:

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

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

答案 2 :(得分:1)

  

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

实际的正则表达式可以在这里找到: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的实现。这将创建相应的IHyperlinkJavaStackTraceHyperlink)。仅在单击链接时才完成实际的解析,然后再次读取整行以获取完整的程序包名称等,然后在工作空间中进行搜索。


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

使用某些正则表达式匹配链接,并在数据中将data属性设置为StyleRange(参见SWT.UNDERLINE_LINK)。单击时,使用

在程序包中按包/类搜索实际文件。
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);

答案 3 :(得分:0)

fullyQualifiedClassName.methodName(fileName:lineNumber)

如果没有fullyQualifiedClassName,Eclipse可能会选择错误的文件。 <{1}}是匹配但未使用所必需的 - 它可以是任何东西。